2009-11-10 28 views
6

Próbuję tłumaczyć następujące od AT & montażu T do montażu Intel:Jak przetłumaczyć "pushl 2000" od AT & T ASM do składni Intel i386

pushl 2000 

Teraz to kompiluje się do:

ff 35 d0 07 00 00  pushl 0x7d0 

Ale bez względu na to, co staram, nie mogę dostać taki sam w Intel synax, próbowałem:

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 

Więc nie mam wskazówek, jaki jest odpowiednik "pushl 2000"?

Odpowiedz

7

Myślę, że oryginalny kod nie robi tego, co myślisz, że robi. Według msdev demontaż jest:

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

która jest równa popychanie:

*((DWORD*)2000) 

NIE popychanie wartość 2000 na stos. Jednak - jeśli to jest naprawdę to, co chcesz wtedy instrukcja jest:

push dword ptr ds:[2000] 

ds: jest wskazaniem do korzystania z rejestru ds segmentu. Rejestry segmentowe są zatrzymaniem od nieprzyjemnych 16-bitowych dni. Najważniejsze z nich to: cs - segment kodu, ds - segment danych i ss - segment stosu (i fs, gdzie zapisywane są lokalne wątki). Pomyśl o nich jako o podstawowych przesunięciach w pamięci. Domyślnie dostęp do danych jest wyłączony z segmentu ds.

Domyślam się, że push dword ptr [2000] nie działało, to że kompilator zdał sobie sprawę, że to było głupie, abyś go użył i "naprawił". Wymuszając użycie prefiksu ds, oznaczasz, że naprawdę chcesz tam uzyskać dostęp do pamięci.

+0

To rzeczywiście wydaje się być poprawne tłumaczenie. Nie mogę powiedzieć, że bardzo dobrze rozumiem oryginalny kod (tak naprawdę nie chcę), ale chcę przetłumaczyć go na składnię Intela. Czy możesz wyjaśnić, skąd pochodzi "ds:"? –

+0

OK - dodałem mały opis "ds" do odpowiedzi. – Aaron

+0

Czy zdajesz sobie sprawę, w jaki sposób mogę uzyskać, aby nie być tak sprytnym? –

1

dla mnie, w GNU assemblera 2.18, dla 32-bitowego cel

.intel_syntax 
push dword [2000] 

generuje:

0: ff 35 d0 07 00 00  pushl 0x7d0 

i NASM:

push dword [dword 2000] 
+0

Ten sam kod generuje to dla mnie "0: \t 68 d4 07 00 00 \t push $ 0x7d4" na 2,20, przekazując go - 32. –