Pregunta

Estoy intentando traducir lo siguiente de AT & T de montaje para el montaje de Intel:

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 fuera de pistas, lo que es el equivalente de "pushl 2000"?

¿Fue útil?

Solución

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

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

Lo 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 de segmento ds. Los registros de segmento son un resabio 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 rosca). Pensar en ellos como las compensaciones de base en la memoria. Por defecto accede a los datos están fuera del segmento ds.

Mi conjetura en cuanto a por qué no funcionó push dword ptr [2000] es que el compilador se dio cuenta de que eso era una cosa tonta para su uso y 'arreglaste'. Al forzar el uso del prefijo ds usted indica que usted realmente quiere decir hacer un acceso a la memoria allí.

Otros consejos

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]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top