l'appel de printf en x86 pour imprimer un entier
Je suis en train d'appel de printf pour imprimer un entier, mis il n'a pas d'imprimer le bon de valeur:
section .data
an: db 1
format: db "num: %d" , 10, 0
section .text
global main
extern printf
main:
push ebp
mov ebp,esp
mov eax, [an]
push eax
push dword format
call printf
add esp, 8
mov esp,ebp
pop ebp
mov eax, 0
ret
ce code affiche "num: 1836412417"
quand j'essaie d'imprimer un char ça marche!!!
section .data
an: db 'a'
format: db "num: %c" , 10, 0
section .text
global main
extern printf
main:
push ebp
mov ebp,esp
mov eax, [an]
push eax
push dword format
call printf
add esp, 8
mov esp,ebp
pop ebp
mov eax, 0
ret
maintenant, il imprime "num: un"
quel est donc le problème avec le premier code ?!!
OriginalL'auteur 3la210 | 2015-03-19
Vous devez vous connecter pour publier un commentaire.
db
déclare de 8 bits (un octet) des valeurs, tandis que%d
tirages 32 bits (quatre octets) des valeurs sur x86.En effet, lors du chargement de 32 bits registre
eax
avecmov eax, [an]
vous êtes le chargement des morceaux de lettres"num"
à haute octets du registre. Ils sont ensuite imprimées en nombre, lors de l'utilisation de%d
ou ignorées lors de l'utilisation%c
.De déclarer 32 bits, vous devez utiliser
dd
, au lieu dedb
.OriginalL'auteur zch
@zch a souligné le problème. Mais si vraiment vous ne voulez imprimer un octet élément de données comme un entier et n'ont pas le luxe de se redéfinir, vous pouvez le faire de cette façon:
La
movsx
instruction signe s'étend sur 8 bits ou de 16 bits de l'opérande (dans ce cas, la 8-bits de l'opérande,[an]
) dans la version 32 bits de registre,eax
. Si elle n'est pas signée, vous devez alors utilisermovzx eax, [an]
(zéro de remplissage).Normalement C, la promotion à l'entier est fait de façon implicite. Mais dans l'assemblée, vous devez le faire vous-même.
OriginalL'auteur lurker