2012-04-11 7 views
2

posted unten ist der Code, den ich für ein einfaches y86 Assembly-Programm habe. Wenn zwei Ganzzahlen angegeben werden, sollte der größere der beiden ausgegeben werden. Rechts von jeder Zeile habe ich eine äquivalente C-Übersetzung.y86 Assembly Labels nicht tun, was sie sein sollten

# I ask about the need for a first line comment below. 
rdint %eax   # scanf("%d", &a); 
rdint %ebx   # scanf("%d", &b); 
rrmovl %eax, %ecx # c = a; 
subl %ebx, %ecx # c = a - b; 
jge  ALarger  # if (c >= 0) { goto ALarger }; 
wrint %ebx   # printf("%d", b); 
jmp  End   # goto End; 

ALarger: 
wrint %eax   # printf("%d", a); 

End: 
irmovl $10, %ecx  # c = 10; 
halt 
wrch %ecx 

Mit dem Assembler yas, die resultierende .yo Datei sieht wie folgt aus:

0x000: f118   | # I ask about the need for a first line comment below. 
0x002: f208   | rdint %eax   # scanf("%d", &a); 
0x004: f238   | rdint %ebx   # scanf("%d", &b); 
0x006: 2001   | rrmovl %eax, %ecx # c = a; 
0x008: 6131   | subl %ebx, %ecx # c = a - b; 
0x00a: 7514000000 | jge  ALarger  # if (c >= 0) { goto ALarger }; 
0x00f: f338   | wrint %ebx   # printf("%d", b); 
0x011: 7016000000 | jmp  End   # goto End; 
        | 
0x016:    | ALarger: 
0x016: f308   | wrint %eax   # printf("%d", a); 
        | 
0x018:    | End: 
0x018: 30810a000000 | irmovl $10, %ecx  # c = 10; 
0x01e: 10   | halt 
  • Dies wurde gerade nicht zusammengebaut. Mir wurde gesagt, dass überall dort, wo ein Etikett vorkommt, es durch die Adresse ersetzt wird, wo es im Programm gefunden wird. Wenn die erste eingegebene Nummer größer ist, lautet die Anweisung in Zeile 0x00a . Dies weist den Programmzähler an, in die Zeile 0x014 (eine Zeile, die nicht einmal existiert) zu gehen, wenn er es anweisen soll, zu 0x016 zu gehen. Das gleiche Problem besteht für die Zeile 0x011. Warum passiert dies?
  • Wenn ich das Programm unter Verwendung der Adresszeilen anstelle von Etiketten zusammensetze, wird das Ergebnis gedruckt, jedoch nicht der Zeilenumbruch. Wie kann ich das beheben?
  • Schließlich eine kleine Frage: Wenn ich keinen Kommentar als erste Zeile hatte, wird die erste Zeile des Codes ignoriert. Soll das passieren?

Vielen Dank für Ihre Zeit, ich freue mich auf jede mögliche Antwort, die Sie zur Verfügung stellen können.

+0

Ich weiß nichts darüber, aber im Netz herum sieht es aus wie die anderen Beispiele, die ich finden kann, haben die Baugruppe eingerückt, mit den Etiketten auf der linken Seite der gleichen Linie zB http: //csapp.cs .cmu.edu/public/simguide.pdf - das könnte erklären, dass die Etikettenadressen falsch sind und, wenn es eine wirklich beschissene Implementierung war, vielleicht sogar die Notwendigkeit eines ersten Kommentars erklären ... mit anderen Worten, eine wilde Vermutung ist, dass Ihr Eingabeformat ist falsch und der YAS-Parser ist verwirrt. –

+0

Was passiert, wenn Sie die Beschriftung auf die gleiche Zeile wie die Anweisung setzen: 'ALarger: wrint% eax' in derselben Zeile usw. –

+0

Wenn ich das tue, dann ist die Zeile für ALarger: wrint% eax immer noch 0x016 und Ende: irmovl $ 10,% ecx ist immer noch 0x018. Die Befehle jge und jmp bleiben ebenfalls unverändert. Scheint eine stilistische Sache zu sein. Danke trotzdem @andrew. –

Antwort

2

Sie setzen die Halte-Anweisung vor Wrch, so dass die Ausführung vor dem Schreiben der Zeilenumbruch stoppt, und es sieht so aus, als ob yas es vollständig ignoriert. Dies könnte deine anderen Probleme erklären, wie die Sprünge um ein Byte verschoben sind; es ist möglich, dass die Anzahl der Zeilen im Programm größer ist als die, die tatsächlich zusammengebaut wurden, den Assembler verwirrt hat, wenn es in die Adresssprünge geht.

+0

Sicher genug, ich habe es versucht und wenn Sie die letzten beiden Zeilen wechseln, funktioniert es gut. – scry

+0

Ihre Logik ist solide und das macht Sinn. Ich bin nicht überrascht, dass es für dich funktioniert hat, so sollte es sein. Ich habe diesen Code ursprünglich so geschrieben, wie Sie es vorgeschlagen haben, aber wenn er zusammengefügt wird, geht die .yo-Datei drunter und drüber. Die letzte Zeile "Halt" wird nicht erzeugt, jede Adresse wird um eins erhöht, und wenn sie ausgeführt wird, stoppt das Programm in einem Schritt. Es läuft auf Ausnahme "HLT", alias Halt. Ich habe festgestellt, dass das Nicht-Setzen der Zeilenschaltung NACH dem Halt dieses Problem für mich hervorruft. Ich habe das Gefühl, dass dies ein Problem außerhalb meiner Kontrolle sein könnte und werde mich bald mit meinem Professor darüber in Verbindung setzen. Danke für Ihre Antwort. –

+0

Fiedelte damit herum und du hattest Recht! Der Trick war, sofort nach dem Halt auf Enter zu drücken. Nach dem Halt muss eine Leerzeile vorhanden sein. y86 ist seltsam. –

Verwandte Themen