Frage

Ich bin eine NASM Quelle GAS „Portierung“ und ich fand die folgenden Codezeilen:

push byte 0
push byte 37

GAS nicht erlaubt "Push-Byte" oder "pushb".

Wie soll ich den obigen Code auf GAS-Syntax übersetzen?

Danke

War es hilfreich?

Lösung

pushb wurde von GAS entfernt. Sie sollten den push Befehl verwenden, um den gleichen Effekt zu erzielen. Etwas mehr Informationen hier .

Andere Tipps

1) push byte in NASM 2.11 64-Bit kompiliert auf die gleiche wie nur push, mit der Ausnahme, dass es sich weigert, zu kompilieren, wenn das Ding geschoben größer als ein Byte:

push 0x0000
push 0x01
push 0x0001
push 0x10

Ist das gleiche wie:

push byte 0x0000
push byte 0x01
push byte 0x0001
push byte 0x10

Aber die folgenden fehlschlagen:

push byte 0x0100
push byte 0x1000
push byte 0x01000000
push byte 0x10000000

Alle diese kompilieren, um die 6a XX Form des Befehls.

2) NASM und GAS automatisch entscheiden, welche Form auf der Operandengröße basiert zu verwenden:

Die GAS 2.25:

push $0x0000
push $0x01
push $0x0001
push $0x10
push $0x0100
push $0x1000
push $0x01000000
push $0x10000000

Kompiliert auf das gleiche wie die NASM:

push 0x0000
push 0x01
push 0x0001
push 0x10
push 0x0100
push 0x1000
push 0x01000000
push 0x10000000

objdump:

   0:   6a 00                   pushq  $0x0
   2:   6a 01                   pushq  $0x1
   4:   6a 01                   pushq  $0x1
   6:   6a 10                   pushq  $0x10
   8:   68 00 01 00 00          pushq  $0x100
   d:   68 00 10 00 00          pushq  $0x1000
  12:   68 00 00 00 01          pushq  $0x1000000
  17:   68 00 00 00 10          pushq  $0x10000000

Also nur push in GAS ist die gleiche wie push byte in NASM, aber ohne die Fehlerprüfung.

3) Der Modifikator, dass hat existiert in GAS ist w wie in:

pushw $0

, die kompiliert:

0:   66 6a 00                pushw  $0x0

d., Fügt den 0x66 Präfix 16-Bit-Betrieb zu wechseln.

NASM äquivalent ist:

push word 0

4) Der Unterschied von mov ist, dass wir nicht willkürlich Druckgrößen kontrollieren können. Sie sind alle Festbeträge auf den Stapel schieben

Der einzige Parameter, den wir auf der Befehlscodierung steuern können, ist der 0x66 Präfix enthält oder nicht.

Der Rest wird durch den Segmentdeskriptor bestimmt. Sehen Sie sich die Intel 64 und IA-32 Architektur-Handbuch Software-Entwicklers - Volume 2 Instruction set Reference - 325383-056US September 2015 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top