Aufruf von printf in x86 zu drucken, eine ganze Zahl
Ich versuche, call printf drucken eine ganze Zahl ist, setzen Sie es nicht drucken Sie die rechts-Wert:
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
dieser code druckt "num: 1836412417"
setzen, wenn ich versuche, drucken ein char es funktioniert!
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
nun druckt er "num:"
also, was ist falsch mit dem ersten code ?!!
InformationsquelleAutor 3la210 | 2015-03-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
db
erklärt 8-bit (ein byte) Werte, während%d
druckt 32-bit (vier byte) Werte, die auf der x86-Architektur.In der Wirkung, beim laden von 32-bit-register
eax
mitmov eax, [an]
laden Sie bits von Buchstaben"num"
zu high-Byte des Registers. Sie werden später gedruckt als Zahl, bei der Verwendung von%d
oder ignoriert, wenn mit%c
.Deklarieren 32-bit-Werten, die Sie verwenden sollten
dd
stattdb
.InformationsquelleAutor zch
@zch darauf hingewiesen, das Problem. Aber wenn Sie wirklich wollen, drucken Sie die ein-byte-Datenelement als integer und nicht den Luxus haben, Sie neu zu definieren, können Sie es auf diese Weise:
Den
movsx
Belehrung Unterschreiben, reicht ein 8-bit oder 16-bit-operand (in diesem Fall die 8-bit-Operanden, die[an]
) in der 32-bit-register,eax
. Wenn es nicht signiert ist, dann würden Sie verwendenmovzx eax, [an]
(zero fill).Normalerweise in C, die Förderung von integer ist implizit durchgeführt. Aber bei der assembly ist, müssen Sie selbst erledigen.
InformationsquelleAutor lurker