我的汇编语言(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
答案 0 :(得分:2)
int
是32位,但是你使用64位算术。一个简单但难看的修复方法是将其扩展为64位,这样您就不必更改代码的其余部分:而不是mov rbx, rdi
执行movsx rbx, edi
。或者,将函数原型更改为使用64位类型,可能是long
。
另请注意,您在未初始化的情况下使用rsi
,这非常糟糕。
PS:学会使用调试器。