2013-04-29 3 views
1

이것은 모두 관련이 있으며 가능한 한 논리적으로 모두 정리하려고 했으므로 나와 함께하시기 바랍니다.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이됩니다.

그러나 내가 이해하지 못하는 것은 레이블 주소입니다. 내가 틀렸다면 나를 바로 잡습니다 : 레이블 주소는 레이블을 호출하는 명령과 관련된 위치에 따라 다릅니다. 따라서 코드의 첫 번째 비트에서 loopendbne보다 두 줄 늦어서 부호를 반전하지 않으며 해당 주소는 "0000000000000001"입니다. 두 번째로 loopendbne 앞에오고 기호를 뒤집어 주소가 "1111111111111011"이됩니다.

주소를 왼쪽 2 비트로 이동했는데 여전히 혼란 스럽습니다. 마지막에 두 개의 0이 없으면 두 번째 loopend과 같이 왼쪽으로 만 이동 하시겠습니까?

내가 가장 궁금해하는 질문은 다음과 같습니다. 0000000000000001, loopend의 주소는 첫 번째 기계 번역에서 온 것인가? 나는 라벨 loopend의 주소는 오프셋 BNE 처음 들어 0000000000100000.

답변

4
BNE -- Branch on not equal 
___________________________________________________________________________ 
|Description: | Branches if the two registers are not equal     | 
|_____________|_____________________________________________________________| 
|Operation: | if $s != $t advance_pc (offset << 2)); else advance_pc (4); | 
|_____________|_____________________________________________________________| 
|Syntax:  | bne $s, $t, offset           | 
|_____________|_____________________________________________________________| 
|Encoding: | 0001 01ss ssst tttt iiii iiii iiii iiii      | 
|_____________|_____________________________________________________________| 

1이 될 것입니다 그래서 1 < < 2 = 4 그래서 당신은 4 바이트로 프로그램 카운터를 증가 생각했다. 워드 크기가 32 비트이기 때문에 오프셋이 b1111111111111011이다 BNE PC가 제에 대해 하나의 인스트럭션

.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 # increment by 1 insruction 
loopend:    # to here (well the next instruction) 

씩 증가, 부호 확장 그 -5 때문에 -5 < < 2 = -20는 프로그램 카운터를 증가 시키도록 by-20 바이트 또는 20 바이트 씩 감소시킵니다. 단어 크기가 32 비트이기 때문에 pc는 5 명령 씩 감소합니다

.text 
    la $a0, opOne 
    lw $a0, 0($a0) 
loopend:     # 
    la $a1, opTwo   # 5 to here 
    lw $a1, 0($a1)  # 4^
    add $t0, $zero, $a0 # 3 | 
    addi $t1, $zero, 1 # 2 | 
    bne $t1, $a1, loopend # 1 | 
    addi $t1, $t1, 1  # decrement by 5 instructions 
+0

정말 고마워요. – Laurence