2017-01-04 4 views
-2

Jedes Mal, wenn ich versuche, meinen Code mit NASM zu kompilieren, wo es einen "Pop" gibt ("Pop al" in diesem Fall), gibt es mir einen Fehler.NASM (Intel) ASM Fehler bei pop

20: error: invalid combination of opcode and operands 

In Zeile 20, ich habe

pop al 

Was ist das Problem?

+4

Haben Sie das Handbuch gelesen? Nicht einmal der bescheidene 8086 (von "al" angenommen) kann ein 8-Bit-Register "drücken" oder "knallen". –

+1

Ich würde vorschlagen, Sie googeln für "8086 Befehlssatz", und vor allem für "addressing Mods", und versuchen zu verstehen, was all diese 'r32, r/m32' etc Sachen bedeutet – Tommylee2k

Antwort

5

Das Problem ist buchstäblich die Fehlermeldung vom Assembler zur Verfügung gestellt: „ungültige Kombination von Opcode und Operanden“. Die POP Anweisung hat keine POP r8 Kodierung möglich. Mit anderen Worten, können Sie nicht einen 8-Bit-Wert vom Stapel pop

Der nächste Äquivalent pop ax wäre, die eine POP r16 Codierung verwendet einen 16-Bit-Wert vom Stapel in die ax Register Pop. Dies ist jedoch nicht genau dasselbe wie Ihr Code, da er sowohl die untere 8-Bit-Hälfte (al) als auch die obere 8-Bit-Hälfte (ah) des 16-Bit-ax-Registers modifiziert.

Eine andere Alternative ist, den Wert direkt vom Stapel zu laden, indem man etwa mov al, BYTE PTR [(r/e)sp] verwendet. Da der Stapelzeiger nicht verändert wird, müssen Sie ihn manuell anpassen.


Beim nächsten Mal geben Sie bitte auch an, was Ihre Zielplattform ist. Dies ist wichtig, da der 16-Bit-Real-Modus im Gegensatz zum 32-Bit- und 64-Bit-Protected-Modus sehr eingeschränkte Möglichkeiten zur Adressierung von Modi bietet. Wenn Sie nicht angeben, auf welchen Modus Sie ausgerichtet sind, funktionieren die Antworten möglicherweise nicht für Sie. Wie hier, ich habe keine Ahnung, ob die mov Anweisung rsp (64-Bit), esp (32-Bit) oder sp (16-Bit) verwenden sollte.