在 NASM 中打印一个负数

print a negative number in NASM

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

我目前正在研究 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                                 

int是32位的,但是你用的是64位算术。一个简单但丑陋的修复方法是将其符号扩展到 64 位,这样您就不必更改其余代码:用 mov rbx, rdi 代替 movsx rbx, edi。或者,将函数原型更改为使用 64 位类型,可能是 long.

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

PS: 学习使用调试器。