2009-04-05 14 views
4

Je suis « portage » une source MSNA GAS et je trouve les lignes de code suivantes:Comment traduire NASM "push byte" en syntaxe GAS?

push byte 0 
push byte 37 

gaz ne permet pas « octet push » ou « pushb ».

Comment est-ce que je devrais traduire le code ci-dessus à la syntaxe de GAS?

Merci

+0

Connexe: http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to-push-a-byte-onto-a-stack-on-pentium-ia-32 –

Répondre

5

pushb a été retiré du gaz. Vous devriez pouvoir utiliser la commande push pour obtenir le même effet. Un peu plus d'informations est here.

1

1)push byte dans MSNA 2.11 64 bits compile à la même chose que tout push, sauf qu'il refuse de compiler si la chose poussé est plus grand qu'un octet:

push 0x0000 
push 0x01 
push 0x0001 
push 0x10 

est le même que:

push byte 0x0000 
push byte 0x01 
push byte 0x0001 
push byte 0x10 

Mais les éléments suivants échouent:

push byte 0x0100 
push byte 0x1000 
push byte 0x01000000 
push byte 0x10000000 

Tous ceux compilent à la forme 6a XX de l'instruction.

2) MSNA et GAS décident automatiquement quelle forme à utiliser en fonction de la taille des opérandes:

Le gaz 2,25:

push $0x0000 
push $0x01 
push $0x0001 
push $0x10 
push $0x0100 
push $0x1000 
push $0x01000000 
push $0x10000000 

Compile au même niveau que MSNA:

push 0x0000 
push 0x01 
push 0x0001 
push 0x10 
push 0x0100 
push 0x1000 
push 0x01000000 
push 0x10000000 

Objdump:

0: 6a 00     pushq $0x0 
    2: 6a 01     pushq $0x1 
    4: 6a 01     pushq $0x1 
    6: 6a 10     pushq $0x10 
    8: 68 00 01 00 00   pushq $0x100 
    d: 68 00 10 00 00   pushq $0x1000 
    12: 68 00 00 00 01   pushq $0x1000000 
    17: 68 00 00 00 10   pushq $0x10000000 

Donc, juste push dans GAS est le même que push byte dans NASM, mais sans la vérification d'erreur.

3) Le modificateur qui ne existe dans le gaz est w comme dans:

pushw $0 

qui compile à:

0: 66 6a 00    pushw $0x0 

-à-dire, ajoute le préfixe 0x66 pour basculer 16 bits opération.

équivalent de MSNA est:

push word 0 

4) La différence de mov est que nous ne pouvons pas contrôler la taille des poussoirs arbitraires: ils sont tous les montants fixes à pousser la pile.

Le seul paramètre que nous pouvons contrôler sur le codage d'instruction est d'inclure le préfixe 0x66 ou non.

Le reste est déterminé par le descripteur de segment. Voir le Intel 64 and IA-32 Architectures Software Developer’s Manual - Volume 2 Instruction Set Reference - 325383-056US September 2015.