Wie zu übersetzen „PUSHL 2000“ von AT & T asm auf Intel-Syntax auf i386
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“?
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]