2016-11-08 1 views
0

현재 MIPS 어셈블리 언어를 배우려고하고 있는데 배열을 사용하는 데 두 가지 다른 방법이 있으며 두 경우의 차이점을 알고 싶습니다.mips - 배열에 액세스하는 방법의 차이

첫번째 방법

  .data 
array: .word 0, 1, 2, 3 
      .text 
main: 
    li $t0, 0 
    lw $t1, array($t0) #t1 = array[0], t1 = 0 
    addi $t0, $t0, 4  #increment 
    lw $t2, array($t0) #t2 = array[1], t2 = 1 

초 방법

  .data 
array: .word 0, 1, 2, 3 
      .text 
main: 
    la $t0, array 
    lw $t1, ($t0) #t1 = 0 
    addi $t0, t0, 4 #increment 
    lw $t2, ($t0) #t2 = 1 

따라서 차이가 뭐죠?

+0

하나 게다가, 당신은 0에서 시작 $ T0에 배열의 주소를로드, 다른 방금 어떤 차이를 0으로로드되지 않습니다 가독성과 나는 표준이 첫 번째 방법이라고 생각한다. –

+0

두 번째 방법은 정상적인 방법입니다. 첫 번째 방법은 배열의 주소가 64KB 미만인 경우에만 작동합니다. – markgz

답변

1

차이점은 lw 명령어에 대한 array 메모리의 위치에 따라 lw은 여러 실제 명령어로 변환되는 의사 명령어가 될 수 있다는 것입니다. .. + 32767

------------------------------- 
| 100011 | base | rt | offset | 
------------------------------- 

(가) 부분은 16 비트 및 32 비트로 부호 확장된다 오프셋 때문에 -32768의 범위를 갖는다 :

lw 명령어의 부호화 (lw rt, offset(base))입니다 . 이는 arraylw 명령어 사이에있을 수있는 최대 거리이며, lw 명령어로 어셈블되는 명령어는 여전히 lw입니다.
arraylw 명령어가 다른 섹션에 있기 때문에 거리가 더 큰 경우 (대부분 arraylw 명령어가 유사 의사로 취급 될 수 있음) 어셈블러는 을 의사 명령어로 처리하여 2, 3 또는 4 실제 코드로 변환 할 수 있습니다 명령. 일부 어셈블러에서는이 기능을 지원하지 않고 대신 오류로 처리합니다.

번역의 모양에 대한 예제 :

# array located at 0x10010000 
# lw $t1,array($t0) located at 0x00400018 

lui $at,0x1001  # $at = 0x10010000 
addu $at,$at,$t0 # $at = 0x10010000 + $t0 
lw $t1,($t0) 
관련 문제