2009-11-10 10 views
6

sto cercando di tradurre il seguente da AT & T assemblaggio a Intel di montaggio:Come tradurre "pushl 2000" asm AT & T per la sintassi Intel su i386

pushl 2000 

Ora questo compila verso il basso per:

ff 35 d0 07 00 00  pushl 0x7d0 

Ma non importa quello che provo, non riesco a ottenere la stessa Intel SYNAX, ho provato:

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 

Quindi sono fuori di indizi, qual è l'equivalente di "pushl 2000"?

risposta

7

Penso che il codice originale non stia facendo quello che pensi che stia facendo. Secondo MSDEV lo smontaggio è:

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

che è pari a spingere:

*((DWORD*)2000) 

NON spingere il valore 2000 nello stack. Tuttavia - se questo è veramente ciò che si desidera, allora l'istruzione è:

push dword ptr ds:[2000] 

ds: è un'indicazione di usare il registro ds segmento. I registri di segmento sono un hold-over da brutti giorni a 16 bit. I principali sono cs - segmento di codice, ds - segmento di dati e ss - segmento di stack (e fs che è il luogo in cui sono memorizzati i locali dei thread). Pensale come offset di base nella memoria. Per impostazione predefinita, gli accessi ai dati sono disattivati ​​dal segmento ds.

La mia ipotesi sul motivo per cui lo push dword ptr [2000] non ha funzionato è che il compilatore si è reso conto che era una cosa stupida da usare e "aggiustata". Forzando l'uso del prefisso ds si indica che si intende realmente effettuare l'accesso alla memoria lì.

+0

che fa anzi sembra essere la traduzione corretta. Non posso dire di aver capito molto bene il codice originale (né lo desidero davvero), ma voglio tradurlo in sintassi Intel. Puoi spiegare da dove proviene "ds:"? –

+0

Okay - Ho aggiunto una piccola descrizione di 'ds' alla risposta. – Aaron

+0

Ti capita di sapere come posso ottenere di non provare ad essere così intelligente? –

1

per me, in GNU assembler 2.18, per la destinazione a 32 bit

.intel_syntax 
push dword [2000] 

genera:

0: ff 35 d0 07 00 00  pushl 0x7d0 

e per nasm:

push dword [dword 2000] 
+0

Questo stesso codice genera per me "0: \t 68 d4 07 00 00 \t spingere $ 0x7d4" su 2,20 passandolo a --32. –

Problemi correlati