MIPS "lui" 运算符和寄存器 $1
MIPS "lui" Operator and Register $1
在 SPIM(MIPS 模拟器)中:
lw , 0x10010000([=11=])
自动更正为
lui , 4097
lw , 0()
...因为地址 0x10010000 是 32 位,而 "lw" 的立即数只能容纳 16 位。
作业题:
- 请注意,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
,如 Assembler Temporary。因此,即使任何寄存器都可以,但如果汇编程序和您都遵循汇编程序对此类事情使用 $at
并且您从不使用 $at
的约定,这将有所帮助。如果汇编程序只是随机选择一个寄存器,它可能会覆盖您想要保留的内容。
在 SPIM(MIPS 模拟器)中:
lw , 0x10010000([=11=])
自动更正为
lui , 4097
lw , 0()
...因为地址 0x10010000 是 32 位,而 "lw" 的立即数只能容纳 16 位。
作业题:
- 请注意,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
,如 Assembler Temporary。因此,即使任何寄存器都可以,但如果汇编程序和您都遵循汇编程序对此类事情使用 $at
并且您从不使用 $at
的约定,这将有所帮助。如果汇编程序只是随机选择一个寄存器,它可能会覆盖您想要保留的内容。