2015-01-23 2 views
0

그냥 내 클래스 중 하나에 대한 어셈블리를 배우기 시작했고이 코드 세그먼트에 대해 약간 혼란 스럽습니다. 이것은 MIPS 지침에서 C로 번역 할 것을 요구하는 교과서 질문에서 비롯됩니다. 나머지 질문은 첨부 된 이미지에 있습니다.MIPS 어셈블리 코드 세그먼트 이해

위의 MIPS 어셈블리 지침의 경우 해당 C 문은 무엇입니까? 변수 f, g, h, i 및 j는 각각 레지스터 $ s0, $ s1, $ s2, $ s3 및 $ s4에 할당된다고 가정합니다. 배열 A와 B의 기본 주소가 각각 레지스터 $ s6과 $ s7에 있다고 가정합니다.

sll $t0, $s0, 2 # $t0 = f * 4 
add $t0, $s6, $t0 # $t0 = &A[f] 
sll $t1, $s1, 2 # $t1 = g * 4 
add $t0, $s6, $t0 # $t1 = &B[g] 
lw $s0, 0($t0) # f = A[f] 
addi $t2, $t0, 4 
lw $t0, 0($t2) 
add $t0, $t0, $s0 
sw $t0, 0($t1) 

나는 몇 가지 MIPS 지침을 기본적으로 이해하고 있지만 솔직히 말해서 배열에 관한 내용은 다소 혼란 스럽다. 여기 누군가가 올바른 방향으로 나를 가리킬 수 있습니까? 감사!

+0

그래서이 코드가하는 일을 자신에게 설명 할 수 있습니까? –

+0

나는 여기서 완전히 틀릴 수도 있지만, 단순히 주석 레지스터에 t2에 A [f + 4]의 값을 할당하면 마지막으로 주석 처리 된 명령 뒤에 첫 번째 추가 명령이 생깁니 까? – purdoo

+0

'A'의 데이터 유형을 실제로 알지 못하기 때문에 말하기 어렵습니다 .. 질문에 실수가없는 경우 4 바이트 너비 인 것 같습니다. –

답변

0

MIPS 어셈블리를 마지막으로 작성한 지 오래되었습니다. 그러나, 무엇에서 나는 처음 몇 지침에서 이해할 수있다 :

sll $t0, $s0, 2  # t0 = 4 * f 
add $t0, $s6, $t0 # t0 = &A[f] 

s0는 배열 A에 액세스 할에 인덱스 f을 보유하고 있습니다. f에 4를 곱하면 A은 4 바이트 길이 (아마도 int)의 데이터 유형 배열입니다. s6는 (의사 코드에서) 당신이 기본적으로 할 것 A[f]의 주소를 액세스 할 수 있기 때문에

address_of_A[f] = base_address_of(A) + offset_of_type_int(f) 

원칙적으로 같은 물건 다음이 개 지침에서 발생하는 배열의 주소를 유지하지만, 배열 B이 시간입니다. 그 후 :

lw $s0, 0($t0)  # f = A[f] 
addi $t2, $t0, 4 # t2 = t0 + 4 

첫 번째 부하가 분명하다, s0 물론 A[f]입니다 주소 t0,의 값을 가져옵니다. 두 번째 숫자는 t0을 4 씩 증가시켜 t2에 저장합니다. 즉 t2에 주소가 &A[f+1] 인 것을 의미합니다. 따라서 배열 A에는 4 바이트 데이터가 포함되어 있습니다.

마지막 lw 명령 $t0에 주소 $t2에서

lw $t0, 0($t2) 

값을 저장, 그래서 $t0 지금 A[f+1]입니다.