2012-06-07 2 views
0

MIPS ISA를 배우려고합니다. MIPS에서이 기능을 수행하려는 경우 :MIPS 어셈블리의 배열에서 두 요소 교환하기

A[2*i]=A[2*k+j]; 

어떻게해야합니까? 내가 읽을 수있는 다른 모든 콘텐츠, 즉 내가 이런 종류의 문제를 해결하는 방법을 읽을 수있는 링크에 감사드립니다.

답변

0

우리는 두 부분이 분해 할 수

  1. 가의 어드레스를 계산 A [2 * I] 및 A [2 * K + J]
  2. 메모리의 제 2 어드레스의 값을 할당 첫 번째 주소에서

나는 (에헴) # 1을 다룰 예정입니다.

  1. 요소의 인덱스는
  2. 의 크기를 원하는
  3. 배열의 시작 주소 :

    는 배열 요소의 주소를 계산하려면 3 가지를 알아야합니다 배열 요소

# 1 & # 3을 계산하는 방법이나 알고있는 것으로 알고 있다고 가정합니다. # 2는 간단한 연산과 관련이 있습니다. (당신이 어떻게 표현했는지, j & k가 표현 되었기 때문에, 나는 거기에서 너무 많이 도울 수 없다).

마지막 단계는 인덱스에 배열 요소의 크기를 곱하는 것입니다. 이 배열의 시작 부분에서 원하는 요소의 오프셋을 제공합니다. 배열의 시작 주소에 해당 주소를 추가하면 요소의 주소가 있습니다.

P. 번역하려는 코드는 두 요소를 바꿔 쓰지 않습니다. 그것은 하나를 다른 것으로 복사합니다.

0

오래되었지만 가까운 수치 일 수 있습니다. 스스로 시도하지 않고 어셈블리 언어를 배울 수 있습니다. 더 많은 예제를 만들고 코드를 작성하십시오. 더 많은 학습 자료 here.

# int calc(int *A, int i, int j, int k) 
# { 
# return A[2 * i] = A[2 * k + j]; 
# } 

# Args: a0=A, a1=i, a1=j, a3=k Rtn: v0 
.text 
.set nomacro 
.set noreorder 
.global calc 
.ent calc 
calc: 
sll $t0, $a1, 3 ; t0 = i * 8 
sll $t1, $a3, 1 ; t1 = k * 2 
add $t1, $t1, $a1 ; t1 += j 
sll $t1, $t1, 2 ; t1 *= 4 
add $t0, $t0, $a0 ; t0 += A 
add $t1, $t1, $a0 ; t1 += A 
lw $v0, 0($t1) ; r = A[4 * (2 * k + j)] 
sw $v0, 0($t0) ; A[4 * (2 * i)] = r 
.end calc 
+0

.global은 .globl이어야합니다. – Wiz

+0

감사합니다. 여기 예제에서 구문을 사용했습니다. http://www.mips.com/media/files/MD00565-2B-MIPS32-QRC-01.01.pdf 아마 다른 어셈블러가 다른 키워드를 사용했습니다. – Gene