2015-03-19 60 views
3

我试图调用printf打印一个整数一个整数,把它不会打印正确的价值:调用的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 

这个代码打印“编号: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:一个”?

有啥错的第一个代码!

回答

6

db声明8位(一个字节)值,而%d在x86上打印32位(四字节)值。

实际上,当加载32位寄存器eaxmov eax, [an]时,您正在将字节"num"的位加载到寄存器的高位字节。当使用%d时,它们被打印为数字,或在使用%c时被忽略。

要声明32位值,您应该使用dd而不是db

+0

感谢您的快速响应,解决问题! (Y) – 3la210 2015-03-19 11:13:49

3

@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中,隐式地完成对整数的提升。但是在汇编中,你需要自己做。

+0

@ 3la210我已经包含这个备选答案,所以选项被理解。 – lurker 2015-03-19 13:52:53

+0

感谢您指点:) – 3la210 2015-03-20 19:23:48