MIPS "lui" 运算符和寄存器 $1

MIPS "lui" Operator and Register $1

在 SPIM(MIPS 模拟器)中:

lw , 0x10010000([=11=])  

自动更正为

lui , 4097
lw , 0()

...因为地址 0x10010000 是 32 位,而 "lw" 的立即数只能容纳 16 位。

作业题:

  1. 请注意,SPIM 使用寄存器 $1 进行替换。它可以使用任何其他寄存器吗?为什么?

回答:是的,它可以使用任何寄存器,只要它是免费的。

太简单了??

完整程序(注意:$a0 是 $4 的别名):

[00400000] 8fa40000  lw , 0()            ; 183: lw $a0 0($sp) # argc 
[00400004] 27a50004  addiu , , 4         ; 184: addiu $a1 $sp 4 # argv 
[00400008] 24a60004  addiu , , 4          ; 185: addiu $a2 $a1 4 # envp 
[0040000c] 00041080  sll , , 2            ; 186: sll $v0 $a0 2 
[00400010] 00c23021  addu , ,           ; 187: addu $a2 $a2 $v0 
[00400014] 0c100009  jal 0x00400024 [main]    ; 188: jal main 
[00400018] 00000000  nop                      ; 189: nop 
[0040001c] 3402000a  ori , [=13=], 10           ; 191: li $v0 10 
[00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit) 


[00400024] 3c011001  lui , 4097             ; 2: lw $a0, 0x10010000([=13=]) 
[00400028] 8c240000  lw , 0()             


[0040002c] 20020001  addi , [=13=], 1           ; 3: addi $v0, [=13=], 1 
[00400030] 0000000c  syscall                  ; 4: syscall 
[00400034] 2002000b  addi , [=13=], 11          ; 6: addi $v0, [=13=], 11 # service #11 
[00400038] 2004000a  addi , [=13=], 10          ; 7: add $a0, [=13=], '\n' # printChar 
[0040003c] 0000000c  syscall                  ; 8: syscall # do print 
[00400040] 3c011001  lui , 4097             ; 10: lb $a0, SIZE([=13=]) 
[00400044] 80240004  lb , 4()             
[00400048] 20020001  addi , [=13=], 1           ; 11: addi $v0, [=13=], 1 
[0040004c] 0000000c  syscall                  ; 12: syscall 
[00400050] 03e00008  jr                    ; 13: jr $ra 

是的,你是对的。

没有强制您使用寄存器 $1 的硬件限制。任何其他人也可以。

</code> 的替代名称是 <code>$at,如 A​​ssembler Temporary。因此,即使任何寄存器都可以,但如果汇编程序和您都遵循汇编程序对此类事情使用 $at 并且您从不使用 $at 的约定,这将有所帮助。如果汇编程序只是随机选择一个寄存器,它可能会覆盖您想要保留的内容。