Pergunta

Eu estou tentando traduzir o seguinte da AT & T montagem para Intel assembly:

pushl 2000

Agora Isso compila para baixo:

ff 35 d0 07 00 00       pushl  0x7d0

Mas não importa o que eu tente, eu não posso obter o mesmo em Intel synax, eu tentei:

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

Então, eu estou fora de pistas, o que é o equivalente a "pushl 2000"?

Foi útil?

Solução

Eu acho que o código original não está fazendo o que você pensa que está fazendo. De acordo com MSDev a desmontagem é:

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

Qual é igual a empurrar:

*((DWORD*)2000)

NÃO empurrando o valor 2000 para a pilha. No entanto - se isso é realmente o que você quer, então a instrução é:

push dword ptr ds:[2000]

ds: é uma indicação de usar o registo de segmento ds. Os registradores de segmento são uma hold-over dos dias 16 bits desagradáveis. Os principais são cs - segmento de código, ds - segmento de dados e ss - segmento de pilha (e fs que é onde os moradores de rosca são armazenados). Pense neles como compensações de base para a memória. Por padrão acessa os dados estão fora do segmento ds.

Meu palpite a respeito de porque push dword ptr [2000] não funcionou é que o compilador percebeu que isso era uma coisa boba para você usar e 'fixa-lo'. Ao forçar o uso do ds prefixo que indicam que você realmente quer dizer para fazer um acesso à memória lá.

Outras dicas

para mim, no GNU assembler 2,18, para o alvo de 32 bits

.intel_syntax
push dword [2000]

gera:

0:   ff 35 d0 07 00 00       pushl  0x7d0

e para nasm:

push dword [dword 2000]
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top