Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在mips中立即打印算术运算的结果时,是否最好将其直接存储到$a0?_Assembly_Mips - Fatal编程技术网

Assembly 在mips中立即打印算术运算的结果时,是否最好将其直接存储到$a0?

Assembly 在mips中立即打印算术运算的结果时,是否最好将其直接存储到$a0?,assembly,mips,Assembly,Mips,如果要立即打印算术运算的结果,为什么在执行运算时仍将结果存储在不同的寄存器中,并将其复制到$a0而不是直接使用$a0?这是更好的做法吗?还是武断 我从其他人那里看到的共同过程是: addi $t0, $zero, 50 li $v0, 1 add $a0, $zero, $t0 syscall 如果我这样做,会不会造成问题 addi $a0, $zero, 50 li $v0, 1 syscall 视情况而定 如果syscall修改了$a0的值,并且在系统调用之后仍然需要该值

如果要立即打印算术运算的结果,为什么在执行运算时仍将结果存储在不同的寄存器中,并将其复制到
$a0
而不是直接使用
$a0
?这是更好的做法吗?还是武断

我从其他人那里看到的共同过程是:

addi $t0, $zero, 50

li $v0, 1  
add $a0, $zero, $t0  
syscall
如果我这样做,会不会造成问题

addi $a0, $zero, 50

li $v0, 1  
syscall
视情况而定

如果
syscall
修改了
$a0
的值,并且在系统调用之后仍然需要该值,则需要以某种方式保留该值

但是,SPIM和MARS中的
syscall
模拟不会修改任何寄存器,文档中明确列出的寄存器除外。因此,如果这就是您运行代码的目的,您通常不必担心保留
$a0
的值

另一种可能性是,编写该代码的人有一些其他代码将在稍后执行,并且该代码假定该值在
$t0

也可能是额外的指令完全没有意义。没有更多的上下文,是不可能说的



另外,
li$t0、50
move$a0、
addi$t0、
add$a0、
唯一重要的是注册
$v0
的内容,并且(对于这个系统调用)
$a0
,当执行
系统调用时。

是的,初学者编写效率低下的代码是很常见的。也许他们在没有理解的情况下复制了+修改的示例,或者没有遵循代码越少/代码越简单几乎总是越好的逻辑。(通常效率更高,并且通常更易于读者理解。包括编写/调试时的程序员。单步调试时对体系结构状态的更改更少,等等)

在MARS/SPIM上,系统调用ABI不会修改
$a0
,因此数据在修改后仍将在寄存器中可用。Linux的系统调用ABI具有不同编号的不同系统调用,但也保留(几乎?)除返回值之外的所有寄存器

如果您希望在系统调用后将某个内容保存在除
$a0
之外的寄存器中,则在系统调用之前复制寄存器是有意义的,例如,在将不同的参数传递给不同的系统调用时将其保存在寄存器中,否则这纯粹是愚蠢的代码膨胀。(以后复印也可以。)


为什么使用
li
设置
$v0=1
,而手动将其扩展到
addi
设置
$a0=50

它不会使机器代码更高效(
ori
addi
不会比任何真实MIPS上的
addi
快,当然,它们可能在模拟器/模拟器上,溢出检入
addi
会占用模拟器中的额外代码。)

但这会使asm源代码更容易阅读,更清晰。(如果您了解汇编程序如何处理
li
move
伪指令,那么使用
$zero
手动写出
addu
addu
只会让人有更多的阅读空间,以了解它只是在创建一个常量或复制一个寄存器。)