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.
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. –
Was passiert, wenn Sie die Beschriftung auf die gleiche Zeile wie die Anweisung setzen: 'ALarger: wrint% eax' in derselben Zeile usw. –
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. –