2009-11-10 8 views
6

Ich versuche, die folgenden von AT & T Montage auf Intel Montage zu übersetzen:Wie "PUSHL 2000" von AT & T asm auf Intel-Syntax auf i386 übersetzen

pushl 2000 

Nun ist diese kompiliert nach unten zu:

ff 35 d0 07 00 00  pushl 0x7d0 

Aber egal was ich versuche, kann ich nicht das gleiche in Intel SYNAX bekommen, 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 bin aus den Hinweisen, was entspricht "pushl 2000"?

Antwort

7

Ich denke, dass der ursprüngliche Code nicht tut, was Sie denken, dass es tut. Nach der Demontage Msdev ist:

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

die zu drängen gleich ist:

*((DWORD*)2000) 

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

push dword ptr ds:[2000] 

ds: ein Anzeichen dafür ist das ds Segmentregister zu verwenden. Die Segmentregister sind ein Überbleibsel von unangenehmen 16-Bit-Tagen. Die wichtigsten sind cs - Code-Segment, ds - Datensegment und ss - Stack-Segment (und fs, wo Thread-Locals gespeichert werden). Denken Sie an sie als Basisoffsets in Erinnerung. Standardmäßig sind Datenzugriffe vom ds Segment entfernt.

Meine Vermutung, warum push dword ptr [2000] nicht funktionierte, ist, dass der Compiler erkannte, dass das eine alberne Sache für Sie war zu verwenden und 'reparierte es'. Wenn Sie das Präfix ds erzwingen, geben Sie an, dass Sie wirklich beabsichtigen, dort einen Speicherzugriff vorzunehmen.

+0

Der in der Tat das zu sein braucht scheint korrekte Übersetzung Ich kann nicht sagen, dass ich den ursprünglichen Code sehr gut verstehe (noch will ich es wirklich nicht), aber ich möchte es in die Intel-Syntax übersetzen. Können Sie erklären, woher das "ds:" kommt? –

+0

Okay - ich fügte der Antwort eine kleine Beschreibung des 'ds' hinzu. – Aaron

+0

Weißt du zufällig, wie ich es schaffen kann, nicht so clever zu sein? –

1

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] 
+0

Der gleiche Code generiert dies für mich "0: \t 68 d4 07 00 00 \t push $ 0x7d4" auf als 2.20 übergibt es - 32. –

Verwandte Themen