Comment traduire « pushl 2000 » d'AT & T asm à la syntaxe Intel sur i386
Question
Je suis en train de traduire les éléments suivants de l'assemblage AT & T à l'assemblage Intel:
pushl 2000
Maintenant, cela compile jusqu'à:
ff 35 d0 07 00 00 pushl 0x7d0
Mais peu importe ce que j'essaie, je ne peux pas obtenir le même dans Intel SYNAX, j'ai essayé:
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
Je suis sur des indices, ce qui est l'équivalent de « pushl 2000 »?
La solution
Je pense que le code d'origine ne fait pas ce que vous pensez qu'il fait. Selon Msdev le démontage est:
003AFCFC FF 35 D0 07 00 00 push dword ptr ds:[7D0h]
est égal à pousser:
*((DWORD*)2000)
ne pas pousser la valeur 2000 sur la pile. Cependant - si c'est vraiment ce que vous voulez alors l'instruction est:
push dword ptr ds:[2000]
ds:
est une indication pour utiliser le registre de segment de ds
. Les registres de segment sont une mise en réserve de vilains jours 16 bits. Les principales sont cs
- segment de code, ds
- segment de données et ss
- segment de pile (et fs
qui est où les habitants de fil sont stockées). Pensez à eux comme des décalages de base en mémoire. Par défaut, les accès données sont hors du segment de ds
.
Je pense que la raison pour laquelle push dword ptr [2000]
n'a pas fonctionné est que le compilateur a réalisé que c'était une chose stupide pour vous d'utiliser et « le fixe ». En forçant l'utilisation du préfixe ds
vous indiquez que vous voulez réellement faire il accès à la mémoire.
Autres conseils
pour moi, en assembleur GNU 2,18 pour cible 32 bits
.intel_syntax
push dword [2000]
génère:
0: ff 35 d0 07 00 00 pushl 0x7d0
et nasm:
push dword [dword 2000]