从 DB 1 加载一个字节,但 printf 整数显示一个大数字
Loading a byte from a DB 1, but printf integer show a large number
我正在尝试调用 printf 来打印一个整数,但是它没有打印出正确的值:
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
此代码打印 "num: 1836412417"
当我尝试打印一个字符时,它起作用了!
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
现在打印 "num: a"
所以第一个代码有什么问题?!!
@zch 指出了这个问题。但是如果你真的想把一个字节数据项作为一个整数打印出来并且没有重新定义它的奢侈,你可以这样做:
movsx eax, BYTE [an] ; [an] is a byte value to be printed with %d
push eax
push dword format
call printf
movsx
指令符号将一个8位或16位操作数(本例中为8位操作数,[an]
)扩展到32位寄存器,eax
.如果它是无符号的,那么您将使用 movzx eax, [an]
(零填充)。
通常在 C 中,提升为整数是隐式完成的。但是在组装中,你需要自己做。
db
声明 8 位(一个字节)值,而 %d
在 x86 上打印 32 位(四个字节)值。
实际上,当用 mov eax, [an]
加载 32 位寄存器 eax
时,您正在将字母 "num"
的位加载到寄存器的高字节。当使用 %d
或使用 %c
.
时,它们稍后打印为数字或忽略
要声明 32 位值,您应该使用 dd
,而不是 db
。
我正在尝试调用 printf 来打印一个整数,但是它没有打印出正确的值:
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
此代码打印 "num: 1836412417"
当我尝试打印一个字符时,它起作用了!
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
现在打印 "num: a"
所以第一个代码有什么问题?!!
@zch 指出了这个问题。但是如果你真的想把一个字节数据项作为一个整数打印出来并且没有重新定义它的奢侈,你可以这样做:
movsx eax, BYTE [an] ; [an] is a byte value to be printed with %d
push eax
push dword format
call printf
movsx
指令符号将一个8位或16位操作数(本例中为8位操作数,[an]
)扩展到32位寄存器,eax
.如果它是无符号的,那么您将使用 movzx eax, [an]
(零填充)。
通常在 C 中,提升为整数是隐式完成的。但是在组装中,你需要自己做。
db
声明 8 位(一个字节)值,而 %d
在 x86 上打印 32 位(四个字节)值。
实际上,当用 mov eax, [an]
加载 32 位寄存器 eax
时,您正在将字母 "num"
的位加载到寄存器的高字节。当使用 %d
或使用 %c
.
要声明 32 位值,您应该使用 dd
,而不是 db
。