2016-07-09 42 views
3

Ich schreibe einen kleinen Maschinencode-Generator für die Montage. Ich habe eine Frage bezüglich sofort in den Speicher Anweisungen:Montage korrekte Verwendung von Wort/Byte/Wort ptr

wir diese drei Szenarien nehmen:

add [ebx+04], 0x1 
add [ebx+04], 0x4040 
add [ebx+04], 0x401000 

Was ich durch die unmittelbare Konstante wird, überprüfe ich, was die kleinste Anzahl von Bytes ist es passen kann dann gehe ich davon aus, ob seine Byte ptr, Wort ptr, dword ptr

erste in 1 Byte passen, damit ich es annehmen sein:

add byte ptr [ebx+04], 0x1 

Zweite in 2 passen Bytes, so nehme ich an, es zu sein:

add word ptr [ebx+04], 0x4040 

dritte passt in 4 Bytes, damit ich es annehmen sein:

add dword ptr [ebx+04], 0x401000 

Ist das richtig?

+8

Nein. Wie können Sie eine 32-Bit-Addition von 1 generieren? Die PTR-Anmerkung ist aus einem bestimmten Grund da. –

+2

gibt es einen Grund für die Byte-Ptr, Word-Ptr, usw.-Nomenklatur. Weil der Benutzer in der Lage sein muss, den Befehl/Operanden auszuwählen. Wenn Sie Ihr eigenes erstellen, können Sie stattdessen addb, addw, addd anstelle von x ptr verwenden. –

+1

wenn add [ebx + 04], 0x00000001 erzeugt ein dword ptr, dann können Sie vielleicht damit durchkommen, wenn die Benutzer die Regeln für Ihre Assemblersprache verstehen. –

Antwort

5

Sie müssen auf jeden Fall Größe Tags auf diese Art von Anweisungen akzeptieren.

Aber ich wouln't den Code entlassen, um zu sehen, welche Zahlen passen, weil Sie einen Weg, auf dem possibiliy zu entscheiden, benötigen eine kleinere Codierung auf Zeichen basierend zu verwenden, um einen Byte erstreckt:

add dword ptr [ebx+4], 1 

Dies kann mit einem 4 Byte sofortigen, aber auch interessanter mit einem 1 Byte sofort codiert werden.

+0

Ich hatte eine andere Frage, ich bin mir bewusst, dass Sie Extend 8-Bit-Wert zu 32 Bit unter Verwendung des Bits signieren können. Gilt es auch für 16bit bis 32bit? – Budskii

+1

Die x86-Architektur definiert, dass dieses _s-Bit_-Zeichen ein Byte in ein Wort erweitert, wenn die Operandengröße 16 Bit beträgt, und dass es ein Byte in ein DWord erweitert, wenn die Operandengröße 32 Bit beträgt. Dies schließt die Vorzeichenerweiterung von 16 Bit auf 32 Bit klar aus. – Fifoernik

3

Wenn Sie auch eine Möglichkeit implementieren, die Operandengröße explizit anzugeben, und da es Ihr Assembler ist, ist es letztlich Ihr Aufruf, eine solche "intelligente" Ableitung zuzulassen oder nicht.

Ich rate dringend dagegen, Programmierer wählen nicht die Operandengröße basierend auf den unmittelbaren Werten, sondern wählen Sie die unmittelbaren auf der Operandengröße basieren.
Einfach ausgedrückt, betrachten wir add DWORD [ebx+04h], 1 und add WORD [ebx+04h], 1 zwei völlig separate Anweisungen.