在NASM中打印一个负数

时间:2015-10-09 13:57:28

标签: unix assembly nasm x86-64 negative-number

我的汇编语言(NASM)功能有问题。 我想知道为什么,当我输入一个负数时,我的函数会打印一个unsigned int。

我目前正在开发mac OSX。

我想知道是否有人可以向我解释错误。

我的原型:

;void    ft_putnbr(int n);

当我在我的函数中输入负值时:

-1我的功能打印4294954951。

section .text

global  _ft_putnbr

_ft_putnbr  :
    push    rbp                         
    mov     rbp, rsp                    
    xor     rbx, rbx                    
    mov     rbx, rdi                    
    cmp     rbx, 0x0                    
    jge     _printnb                    
    neg     rbx                         
    mov     rax, SYS_WRITE               
    mov     rdi, 1                      
    mov     [rsi], byte 45              
    mov     rdx, 1                      
    syscall                             

_printnb        :
    cmp     rbx, 0x9                    
    jg      _recursion                  
    mov     [rsi], byte 48              
    add     [rsi], rbx                   
    mov     rdi, 1                      
    mov     rax, SYS_WRITE              
    mov     rdx, 1                       
    syscall                             
    jmp     _return                     

_recursion  :
    xor     rdx, rdx                    
    xor     rax, rax                    
    mov     rcx, 10                     
    mov     rax, rbx                    
    div     rcx                          
    push    rdx                         
    mov     rdi, rax                    
    call    _ft_putnbr                     
    pop     rdi                         
    call    _ft_putnbr                     
    jmp     _return                     

_return     :
    leave                               
    ret                                 

1 个答案:

答案 0 :(得分:2)

int是32位,但是你使用64位算术。一个简单但难看的修复方法是将其扩展为64位,这样您就不必更改代码的其余部分:而不是mov rbx, rdi执行movsx rbx, edi。或者,将函数原型更改为使用64位类型,可能是long

另请注意,您在未初始化的情况下使用rsi,这非常糟糕。

PS:学会使用调试器。