2016-10-27 3 views
2

방금 ​​어셈블리를 배우기 시작했고 한 번의 실습에서 다음 코드의 결과를 찾아야 만했습니다. 그러나 저는 매우 새롭기 때문에 그것이 무엇인지 확실하지 않습니다. 주로 add입니다.조립품 코드 출력 - 추가 사항과 혼동?

어셈블리 코드 :

addi $8, $0, 0  # $8 = $0 + 0 = 0 + 0 = 0 
addi $9, $0, 8  # $9 = $0 + 8 = 0 + 8 = 8 
L1: 
    add $4, $0, $8  # $4 = $0 + $8 = $8 
    addi $2, $0, 1  # $2 = $0 + 1 = 0 + 1 = 1 
    addi $8, $8, 1  # $8 = $8 + 1 
    syscall  # show the number in $4 
bne $8, $9, L1  # if $8 ≠ $9 go to L1 (line 3) 

나는 그것을 보는 방법, 위의 코드를 출력합니다 나는 총회에 새로운 해요 이후 0-7,하지만, 나는에 코드를 변환하는 생각 번호 C + +를 알아낼 수 있습니다,하지만 난 add $4, $0, $8$4 = &$8을 번역하는 경향이 때문에 C++에서 나는 1-8을 얻었다.

C++ 코드 :

#include <iostream> 
using namespace std; 

int main() { 
    int $0 = 0, $2, $8, $9, *$4; 

    $8 = $0 + 0;  // $8 = 0 
    $9 = $0 + 8;  // $9 = 8 

    do { 
    $4 = &$8; 
    $2 = $0 + 1; 
    $8 = $8 + 1; 
    cout << *$4 << endl; 
    } 
    while ($8 != $9); 
    return 0; 
} 

질문 :인가 국회 add $4, $0, $8$4 포인터 것으로 생각 될 수 $8 또는 $8가에서 무엇 단순히 동일 시간. (이 혼란은 add) 옆의 주석으로 작성되었습니다.

+0

은 C++는 MIPS의 ASM 프로토 타입에 대한 의사 코드로 _valid_ 동안, 변경을 고려 (예를 들어)'[마찬가지로 다른 사람] r0''에 $ 0', 다른 이유가있는 경우하면 더 깨끗하게 컴파일하고합니다 조용한 청산. 그러나 IIRC, 어쨌든 심볼에서'$'를 허용하는 컴파일 옵션이있을 수 있습니다. –

+0

팁 @CraigEstey에 감사드립니다 : –

답변

2

$ 4의 값을 명령 실행시의 값과 같이 $ 8 값으로 설정합니다. 귀하의 코드는 $ 8에 $ 8의 값을 추가하기 때문에 $ 8의 값을 $ 4에로드하는 것과 같습니다.

참고 : move $4 $8을 사용하여 동일한 작업을 수행 할 수 있습니다.

+0

그래서''0-7' **을 출력합니까? –

+0

네, 맞습니다. –

+0

$ 4를 $ 8의 주소로 설정하려면'la $ 4 $ 8'을 사용해야합니다. –

2

Zach가 언급 한 것처럼 C++ 코드는 $ 4의 값을 $ 8 값으로 설정하지만 어셈블리는 $ 4에서 $ 8 값을 설정합니다. 따라서 올바른 C++ 코드는 아래에 있습니다. 그것이 인쇄 된 것은 운동으로 남아 있습니다!

또한 $ 2는 syscall 용으로 설정되었으므로 C++ 코드에는 $ 2가 필요하지 않습니다. "사용되지 않은 변수"경고를 제거하기 위해 제거했습니다.

#include <iostream> 
using namespace std; 

int main() { 
    int $0 = 0, $8, $9, $4; 

    $8 = $0 + 0;  // $8 = 0 
    $9 = $0 + 8;  // $9 = 8 

    do { 
    $4 = $8; 
    $8 = $8 + 1; 
    cout << $4 << endl; 
    } 
    while ($8 != $9); 
    return 0; 
} 
+0

답장을 보내 주셔서 감사합니다 @dave. 당신은 무엇을 의미합니까? 어셈블리 코드에 왜 이것이 존재하지 않는지 궁금합니다. –

+1

@AngelPolitis : 실행하고자하는 운영 체제에 _which_ 시스템 호출을 알려줘야합니다. 나는 syscall 번호가 $ 2에 전달되었다고 가정하지만, 문서를 확인해야 할 것이다. – dave

+0

당신이 옳습니다. 운동은 정수를 출력하기 위해 $ 2를 1로 설정하고 인쇄하고자하는 값을 $ 4 "*로 설정해야합니다.**'$ 2' **와 **'$ 4' **의 이유는 분명하지 않지만, 배울 때 알아낼 수있을 것 같습니다. 도와 주셔서 감사합니다. –