(MIPS 시뮬레이터) 등록
lw $4, 0x10010000($0)
자동 주소 0x10010000는 32 비트 및 즉시 값이므로 ...
lui $1, 4097
lw $4, 0($1)
되도록 보정 "lw"는 16 비트 만 저장할 수 있습니다.
숙제 질문 : 교체를 위해 $ 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
그렇게 많은 의미가 있습니다! MIPS에서 레지스터를 "비우기"위한 방법이 없으므로 (이 값을 0으로 설정해야 함) 어셈블러는 레지스터의 값이 필요한지 여부를 알 수 없습니다. 따라서 우연한 덮어 쓰기를 방지하기 위해 협약에 따라 $ 1을 사용합니다. – NoName