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 »?

Était-ce utile?

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]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top