2017-05-22 7 views
2

(MIPS 시뮬레이터) 등록

lw $4, 0x10010000($0) 

자동 주소 0x10010000는 32 비트 및 즉시 값이므로 ...

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

되도록 보정 "lw"는 16 비트 만 저장할 수 있습니다.

숙제 질문 : 교체를 위해 $ 1을 (를) 등록 사용 스핌

  1. 참고. 다른 레지스터를 사용할 수 있습니까? 왜?

답변 : 예, 무료 인 한 모든 레지스터를 사용할 수있었습니다.

너무 쉽게 ??

전체 프로그램

[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 

답변

1

$1의 대체 이름은 어셈블러 임시과 같이 $at입니다. 그래서 어떤 레지스터라도 할지라도 어셈블러와 여러분 모두가 어셈블러가 $at 같은 것을 사용하고 결코 $at을 사용하지 않는다는 규칙을 따르는 것이 좋습니다. 어셈블러가 무작위로 레지스터를 선택한 경우 유지하려는 항목을 덮어 쓸 수 있습니다.

+0

그렇게 많은 의미가 있습니다! MIPS에서 레지스터를 "비우기"위한 방법이 없으므로 (이 값을 0으로 설정해야 함) 어셈블러는 레지스터의 값이 필요한지 여부를 알 수 없습니다. 따라서 우연한 덮어 쓰기를 방지하기 위해 협약에 따라 $ 1을 사용합니다. – NoName

1

예, 당신 말이 맞아 : (참고 : $의 A0은 $ 4 별칭입니다).

$ 1 레지스터를 사용해야하는 하드웨어 제한은 없습니다. 다른 모든 사람들도 마찬가지입니다.

+0

아뇨, 그 명령을 대체 할 때 사용하는 SPIM이 선택한 레지스터 (나 아님)입니다. 따라서 전체 32 비트 주소를 저장하기 위해 레지스터 $ 1을 선택한 이유는 없습니다. – NoName