2017-02-14 8 views
1

현재 아키텍처 과정을 수강 중이며 그 수업의 일환으로 MIPS 어셈블리를 배우고 있습니다.MIPS 어셈블리에서 lw/sw 연산의 형식?

 
[opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits 

    written as: 
    lw $rt, offset($rs)  # where offset is an immediate value 

OK, 그래서 내가 A [i]는 액세스하려는 가정 해 봅시다 :

IT는 LW와 자상 한 작업이 I-형식이 레지스터 피연산자를 허용하는 지침 및 한 즉시 피연산자 것을 나의 이해이다.

 
    sll $t0, $s1, 2  # i*4 (offset) 
    add $t0, $s7, $t0 # $t0 = &A[i] 
    lw $t1, 0($t0)  # $t1 = A[i] 

은 내가 대한 혼란 스러워요하는 교수님한다 : (A)의 기본 주소를 가정하면 레지스터 $의 S7에 인덱스 (i)는 레지스터 $의 S1에서, 나는의 라인을 따라 뭔가를해야 할 것 우리는 또한 3 개 레지스터와 함께이 같은 LW 명령을 할 수있는 말을 계속 :

 
    sll $t0, $s1, 2  # i*4 (offset) 
    lw $t1, $t0($s7) # $t1 = A[i] 

는 이러한 솔루션의 모두 정확합니까? 아니면 내 강사가 틀렸어? 오프셋 할 수있는 레지스터를 사용할 수 없습니까? 오프셋은 즉각적인 숫자 여야한다고 생각했습니다. 당신이 여분의해야 할 이유는 첫 번째 해결책에 명령을 추가해야하기 때문에 실제로는 수 없기 때문에은 오프셋으로 레지스터를 사용합니다.

+0

어셈블리 언어는 어셈블러에서 어셈블리 언어를 정의하고 어셈블러에서이를 읽은 프로그램에서 컴퓨터 코드를 만듭니다. 일반적으로 C++이나 JAVA와 같은 표준화 된 언어는 어딘가에 있지 않습니다. MIPS는 이미 의사 명령어를 일반적으로 사용하고 있으며 일부 특정 어셈블러에 대한 또 다른 의사 명령어가 될 수 있습니다. –

답변

0

lw/sw의 오프셋은 즉각적이어야합니다. 강사가 레지스터 오프셋을 허용하는 MIPS 명령어 세트에 lw/sw의 변형이 있다고 주장하면 그/그녀는 올바르지 않습니다.

그러나 의사 명령어과 같은 변형을 허용하고 실제 MIPS 명령어로 변환하는 어셈블러가있을 수 있습니다. 이 경우 가능한 번역은 다음과 같을 수 있습니다.

addu $at,$s7,$t0 
lw $t1, 0($at) 
+0

페터 닉 (pedantic)이되기 위해서 (쓸데없는) MIPS DSP 아키텍처 확장은 레지스터를 오프셋으로 사용할 수있는'lwx $ rd, $ rxxx ($ ryyy)'명령을 포함했다. – markgz