在 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: 学习使用调试器。
我的汇编语言函数有问题 (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: 学习使用调试器。