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.
Connexe: http://stackoverflow.com/questions/2586591/why-is-it-not-possible-to-push-a-byte-onto-a-stack-on-pentium-ia-32 –