Como traduzir “pushl 2000”, da AT & T asm a sintaxe Intel em i386
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"?
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]