在SPIM(MIPS模拟器)中:
lw $4, 0x10010000($0)
自动更正为
lui $1, 4097
lw $4, 0($1)
...因为地址0x10010000是32位,立即值“lw”只能容纳16位。
家庭作业问题:
答案:是的,它可以使用任何注册表,只要它是免费的。
太容易了?
完整程序(注意:$ a0是$ 4的别名):
[00400000] 8fa40000 lw $4, 0($29) ; 183: lw $a0 0($sp) # argc
[00400004] 27a50004 addiu $5, $29, 4 ; 184: addiu $a1 $sp 4 # argv
[00400008] 24a60004 addiu $6, $5, 4 ; 185: addiu $a2 $a1 4 # envp
[0040000c] 00041080 sll $2, $4, 2 ; 186: sll $v0 $a0 2
[00400010] 00c23021 addu $6, $6, $2 ; 187: addu $a2 $a2 $v0
[00400014] 0c100009 jal 0x00400024 [main] ; 188: jal main
[00400018] 00000000 nop ; 189: nop
[0040001c] 3402000a ori $2, $0, 10 ; 191: li $v0 10
[00400020] 0000000c syscall ; 192: syscall # syscall 10 (exit)
[00400024] 3c011001 lui $1, 4097 ; 2: lw $a0, 0x10010000($0)
[00400028] 8c240000 lw $4, 0($1)
[0040002c] 20020001 addi $2, $0, 1 ; 3: addi $v0, $0, 1
[00400030] 0000000c syscall ; 4: syscall
[00400034] 2002000b addi $2, $0, 11 ; 6: addi $v0, $0, 11 # service #11
[00400038] 2004000a addi $4, $0, 10 ; 7: add $a0, $0, '\n' # printChar
[0040003c] 0000000c syscall ; 8: syscall # do print
[00400040] 3c011001 lui $1, 4097 ; 10: lb $a0, SIZE($0)
[00400044] 80240004 lb $4, 4($1)
[00400048] 20020001 addi $2, $0, 1 ; 11: addi $v0, $0, 1
[0040004c] 0000000c syscall ; 12: syscall
[00400050] 03e00008 jr $31 ; 13: jr $ra
答案 0 :(得分:1)
是的,你是对的。
没有强制您使用寄存器$ 1的硬件限制。任何其他人都会这样做。
答案 1 :(得分:1)
$1
的替代名称为$at
,与汇编程序临时一样。因此,即使任何寄存器都可以,但如果汇编程序和您遵循汇编程序使用$at
这样的约定并且您从不使用$at
的约定,则会有所帮助。如果汇编程序随机选择了一个寄存器,它可能会覆盖你想保留的东西。