Frage

Ich versuche, die folgenden von AT & T Montage auf Intel Montage zu übersetzen:

pushl 2000

Nun ist diese kompiliert nach unten an:

ff 35 d0 07 00 00       pushl  0x7d0

Aber egal was ich versuche, ich kann nicht das gleiche in Intel SYNAX, ich habe versucht:

intel asm
disassembly after compiling to at&t

push 2000
68 d0 07 00 00          push   $0x7d0

push [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr [2000]
68 d0 07 00 00          push   $0x7d0

push dword ptr 2000
68 d0 07 00 00          push   $0x7d0

Also ich aus Hinweisen bin, was ist das Äquivalent von „PUSHL 2000“?

War es hilfreich?

Lösung

ich glaube, das Original-Code nicht tut, was Sie denken, es tut. Nach der Demontage Msdev ist:

003AFCFC FF 35 D0 07 00 00 push        dword ptr ds:[7D0h] 

Welche gleich drücken:

*((DWORD*)2000)

drückt nicht den Wert 2000 auf den Stapel. Allerdings - wenn das wirklich das, was Sie wollen, dann der Befehl:

push dword ptr ds:[2000]

ds: ist ein Hinweis darauf, das ds Segmentregister zu verwenden. Die Segmentregister sind ein Hold-over vor bösen 16-Bit-Tagen. Die wichtigsten ist cs - Code-Segment, ds - Datensegment und ss - Stacksegment (fs und die, wo Gewinde einheimische gespeichert werden). Betrachten Sie sie als Basis-Offsets in den Speicher. Durch Standarddatenzugriffe aus dem ds Segment.

Meine Vermutung, warum push dword ptr [2000] hat nicht funktioniert, ist, dass der Compiler, dass das erkannte eine dumme Sache war für Sie zu nutzen und ‚es‘ befestigt. Durch Erzwingen Verwendung des ds Präfix angeben, dass Sie wirklich ein Speicherzugriff zu tun bedeutet zu.

Andere Tipps

für mich, in GNU Assembler 2.18, für 32-Bit-Ziel

.intel_syntax
push dword [2000]

erzeugt:

0:   ff 35 d0 07 00 00       pushl  0x7d0

und für nasm:

push dword [dword 2000]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top