이것은 모두 관련이 있으며 가능한 한 논리적으로 모두 정리하려고 했으므로 나와 함께하시기 바랍니다.MIPS 라벨 주소 지정?
라벨을 올바르게 주소 지정하는 방법에 대해 정말로 혼란 스럽습니다. 예를 들어, 다음의 코드 비트에 "BNE는"가 "00010101001001010000000000000001"변환하고 loopend의 라벨 어드레스으로 0x00000020 (32)
.text
la $a0, opOne
lw $a0, 0($a0)
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
loopend:
I가 loopend 이동 "BNE"은 "00010101001001011111111111111011"이된다 및 loopend의 주소가된다 0x00000008 (8)
.text
la $a0, opOne
lw $a0, 0($a0)
loopend:
la $a1, opTwo
lw $a1, 0($a1)
add $t0, $zero, $a0
addi $t1, $zero, 1
bne $t1, $a1, loopend
addi $t1, $t1, 1
그래서에서 내가 이해의 주소는 4 * 8 = 32 = 용으로 0x00000020 그래서, 코드의 첫 번째 비트에,
loopend
는, 팔 지시 후입니다. 두 번째 코드 비트 인
loopend
은 두 명령어 뒤에 있으므로 주소가 4 * 2 또는 0x00000008이됩니다.
그러나 내가 이해하지 못하는 것은 레이블 주소입니다. 내가 틀렸다면 나를 바로 잡습니다 : 레이블 주소는 레이블을 호출하는 명령과 관련된 위치에 따라 다릅니다. 따라서 코드의 첫 번째 비트에서 loopend
은 bne
보다 두 줄 늦어서 부호를 반전하지 않으며 해당 주소는 "0000000000000001"입니다. 두 번째로 loopend
은 bne
앞에오고 기호를 뒤집어 주소가 "1111111111111011"이됩니다.
주소를 왼쪽 2 비트로 이동했는데 여전히 혼란 스럽습니다. 마지막에 두 개의 0이 없으면 두 번째 loopend
과 같이 왼쪽으로 만 이동 하시겠습니까?
내가 가장 궁금해하는 질문은 다음과 같습니다. 0000000000000001, loopend
의 주소는 첫 번째 기계 번역에서 온 것인가? 나는 라벨 loopend
의 주소는 오프셋 BNE 처음 들어 0000000000100000.
정말 고마워요. – Laurence