MIPS“lui”运营商并注册$ 1

时间:2017-05-22 18:08:33

标签: mips mips32

在SPIM(MIPS模拟器)中:

lw $4, 0x10010000($0)  

自动更正为

lui $1, 4097
lw $4, 0($1)

...因为地址0x10010000是32位,立即值“lw”只能容纳16位。

家庭作业问题:

  1. 请注意,SPIM使用寄存器$ 1进行更换。它可以使用任何其他注册表吗?为什么?
  2. 答案:是的,它可以使用任何注册表,只要它是免费的。

    太容易了?

    完整程序(注意:$ 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 
    

2 个答案:

答案 0 :(得分:1)

是的,你是对的。

没有强制您使用寄存器$ 1的硬件限制。任何其他人都会这样做。

答案 1 :(得分:1)

$1的替代名称为$at,与汇编程序临时一样。因此,即使任何寄存器都可以,但如果汇编程序和您遵循汇编程序使用$at这样的约定并且您从不使用$at的约定,则会有所帮助。如果汇编程序随机选择了一个寄存器,它可能会覆盖你想保留的东西。