2009-11-10 9 views
6

Estoy intentando traducir lo siguiente de AT & conjunto en T para el montaje de Intel:Cómo traducir "pushl 2000" de AT & T asm a la sintaxis de Intel en i386

pushl 2000 

Ahora bien, esto compila a:

ff 35 d0 07 00 00  pushl 0x7d0 

Pero no importa lo que intente, no puedo conseguir lo mismo en Intel SYNAX, he intentado:

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 

Así que estoy sin pistas, ¿qué es el equivalente a "pushl 2000"?

Respuesta

7

Creo que el código original no está haciendo lo que crees que está haciendo. De acuerdo con Msdev el desmontaje es:

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

que es igual a empujar:

*((DWORD*)2000) 

NO empujando el valor 2000 en la pila. Sin embargo - si eso es realmente lo que quieres, entonces la instrucción es:

push dword ptr ds:[2000] 

ds: es una indicación para utilizar el registro ds segmento. Los registros de segmento son una retención de días desagradables de 16 bits. Los principales son cs - segmento de código, ds - segmento de datos y ss - segmento de pila (y fs, que es donde se almacenan los locales de hilos). Piense en ellos como compensaciones básicas en la memoria. Por defecto, los accesos de datos están fuera del segmento ds.

Mi suposición de por qué push dword ptr [2000] no funcionó es que el compilador se dio cuenta de que era una tontería que usted la usara y la "corrigió". Al forzar el uso del prefijo ds, indica que realmente quiere hacer un acceso de memoria allí.

+0

que en efecto parece ser el traducción correcta. No puedo decir que entiendo muy bien el código original (ni tampoco lo deseo), pero quiero traducirlo a sintaxis Intel. ¿Puede explicar de dónde viene el "ds:"? –

+0

Bien - He añadido una pequeña descripción de los 'ds' a la respuesta. – Aaron

+0

¿Sabes cómo puedo llegar a intentar no ser tan inteligente como ese? –

1

para mí, en GNU ensamblador 2,18, para la meta de 32 bits

.intel_syntax 
push dword [2000] 

genera:

0: ff 35 d0 07 00 00  pushl 0x7d0 

y para nasm:

push dword [dword 2000] 
+0

Ese mismo código genera esto para mí "0: \t 68 d4 07 00 00 \t presione $ 0x7d4" como 2.20 pasándolo --32. –

Cuestiones relacionadas