2014-06-16 1 views
1

A[2*i]=A[2*k+j];을 어셈블리 언어로 변환하려고합니다. int (4 바이트)의 배열 'A'는 Astart (32 비트)에서 시작하고 i, j, k$s0, $s1, $s3에 저장됩니다.C 언어의 어셈블리 언어 구현

그래서 문제를 올바르게 이해하고 있다면 [2*k+j] 요소의 주소와 값을 [2*i] 요소로 설정해야합니까? 내 혼란은 주소를 수정하고있다. 이것이 내가 가진 것입니다.

add $t0, $s0, $s0  #2*i 
add $t1, $s3, $s3  #2*k 
add $t2, $t1, $s3  #2*k+j 
sw $t2, Astart 
sw $t0 4(Astart) 

이 내용이 정확합니까?

+0

: 같은

수정 된 코드를 볼 수 있습니다. 나는 MIPS를 모른다. 하지만 인덱스 어드레싱 모드를 보면 도움이 될 것입니다 ... – Sam

답변

1

여기서 두 단계가 필요합니다. 먼저 A[2*k+j]에서로드하고 두 번째로 A[2*i]에서로드하십시오.

2*i2*k+j을 이미 계산했지만 (32 비트 정수의 각 요소 오프셋은 4 바이트이기 때문에) 4를 곱한 것을 잊어 버렸습니다. 내가 86 어셈블리 프로그래머입니다

add $t0, $s0, $s0  #2*i 
add $t1, $s3, $s3  #2*k 
add $t2, $t1, $s3  #2*k+j 

sll $t1 $t1 2 
sll $t2 $t2 2 

la $t0 Astart 
add $t3 $t0 $t1 #Address of A[2*k] 
add $t4 $t0 $t2 #Address of A[2*k+j] 

lw $t0 0($t3) 
sw $t0 0($t4) 
+0

$ t1과 $ t2에 4를 곱한 이유를 설명 할 수 있습니까? – spearman008

+1

@ spearman008 귀하의 질문에 배열 'A'를 int 배열로 정의합니다 (각 int는 4 바이트 임). 4를 곱하지 않으면 1 바이트의 오프셋 만 사용하여 데이터에 액세스하므로 각 요소는 4 바이트로 정의되므로 다음 요소를 가져 오려면 4 바이트가 필요합니다. –