2016-10-27 2 views
2

Ich habe gerade angefangen Assembly zu lernen und in einer Übung muss ich die Ausgabe des folgenden Codes finden, aber da ich sehr neu bin, bin ich mir nicht sicher was es ist und das liegt hauptsächlich an add.Ausgabe des Assembly-Codes - Confusion with add?

Assembly Code:

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) 

So wie ich es auch dreht, der obige Code sollte die Zahlen 0-7, Ausgang, aber da ich auf Montage bin neu, ich dachte, den Code zu übersetzen zu C++, um es herauszufinden, aber in C++ ich habe 1-8, weil ich geneigt war add $4, $0, $8 als $4 = &$8 zu übersetzen.

C++ Code:

#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; 
} 

Frage: Ist Versammlung add $4, $0, $8 gedacht werden als $4 ein Zeiger auf $8 sein oder einfach gleich, was $8 ist die Zeit. (Die Verwirrung wurde durch den Kommentar neben add) erstellt.

+0

Während die C++ als Pseudo-Code _valid_ ist der Mips asm für Prototyping, in Erwägung ziehen (zB) '$ 0 'in' r0' [ebenfalls für andere], wenn aus keinem anderen Grunde, um es sauber zu machen kompilieren und leise LLs. Wie auch immer, IIRC, kann es eine Kompilierungsoption geben, um '$' in Symbolen trotzdem zuzulassen –

+0

Danke für den Tipp @CraigEstey :) –

Antwort

2

Sie setzen den Wert von $ 4 auf den Wert von $ 8, was auch immer es ist, wenn diese Anweisung ausgeführt wird. Ihr Code besagt, dass Sie, da Sie den Wert von $ 8 zu $ ​​0 hinzufügen, dasselbe tun, als nur den Wert von $ 8 zu $ ​​4 zu laden.

Hinweis, Sie können das gleiche erreichen, indem Sie move $4 $8 verwenden.

+0

So gibt es ** '0-7' **? –

+0

Ja, das ist richtig. –

+0

Um $ 4 auf die Adresse von $ 8 zu setzen, müssten Sie 'la $ 4 $ 8' verwenden. –

2

Wie von Zach erwähnt, setzt Ihr C++ - Code $ 4 auf den Wert der Adresse von $ 8, aber die Baugruppe setzt den Wert von $ 4 auf $ 8. Daher ist der korrekte C++ Code unten. Was es ausdruckt, bleibt als Übung übrig!

Zusätzlich ist $ 2 nur für den Syscall gesetzt, also brauchen wir es nicht in unserem C++ Code: Ich habe es entfernt, um die Warnung "unbenutzte Variable" loszuwerden.

#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

Danke für deine Antwort @dave. Was meinst du *** $ 2 ist nur für den syscall *** gesetzt? Ich habe mich gefragt, warum es überhaupt im Assembly-Code existiert, da es nicht verwendet wird. –

+1

@AngelPolitis: Sie müssen dem Betriebssystem mitteilen, welcher Systemaufruf ausgeführt werden soll. Ich gehe davon aus, dass der syscall-Nummer in $ 2 übergeben wird, aber Sie müssten Ihre Dokumentation dafür überprüfen. – dave

+0

Sie haben Recht. Die Übung sagt * '', um eine ganze Zahl auszugeben, wir müssen $ 2 auf 1 setzen und den Wert, den wir drucken wollen, auf $ 4 '' * setzen.Es ist mir nicht klar, warum ** '2 $ ** und warum **' 4 $ **, aber ich denke, ich werde es herausfinden, wenn ich lerne. Danke für die Hilfe. –