我刚开始使用asm,正在尝试编写一些基本的函数,看起来我的write、putchar和putstr都可以工作,但是我的putnbr打印不正确。当我尝试正片nbr时,它只打印第一个nbr,对于所有其他nbr,它打印0,当我打印负片nbr时,它打印400000之类的东西。我的putchar代码如下:
BITS 64
extern ___error
default rel
section .bss
buffer resb 1 ; buffer used for character to syscall write
section .text
global _ft_putchar
_ft_putchar:
mov [buffer], rdi ; input char written to addres
mov rsi, buffer ; address of char passed to write
mov rdi, 1 ; set fd
mov rdx, 1 ; set amount of char
mov rax, 0x2000004 ; set syscall
syscall
jc _error
jmp _ret
_error: ; function to set errno
push rax
call ___error
pop qword [rax]
mov rax, -1
_ret:
ret
putnbr在递归中,我使用的逻辑与我在C中的putnbr中使用的逻辑相同:
BITS 64
extern _ft_putchar
section .text
global _ft_putnbr
_ft_putnbr: ; function to print nbr given to it in rdi
_loop:
xor rax, rax ; set rax to 0
cmp rdi, 0
jnge _put_dash ; if nbr < 0, write a '-' and do nbr * -1
cmp rdi, 10
jnae _put_dig ; if nbr < 10, write the nbr
mov rax, 0
mov rax, rdi ; put nbr in rax
mov rbx, 10
mov rdx, 0 ; set rdx to 0 (prepare for remainder div)
div rbx ; devide rax by 10 put remainder in rdx
mov rdi, 0 ; set rdi to 0 (prepare for function call)
push rdi
mov rdi, rax ; mov rax to rdi to do next iteration putnbr with
call _ft_putnbr
pop rdi
mov rdi, rdx ; remainder div stored in rdx to rdi
jmp _put_dig
_put_dash: ; subroutine for writing dash and inversing nbr
push rdi ; save rdi on stack
mov rdi, 0
mov rdi, '-' ; mov the printable char to rdi
call _ft_putchar
pop rdi ; get rdi back from stack
neg rdi ; invers nbr to positive
jmp _loop ; go back to loop
_put_dig:
add rdi, 48 ; add 48 so nbr is ascii
call _ft_putchar ; write nbr
ret
我试着在函数之前推动en pop,并尝试在eax和edi上部分工作,而不是他们的四字寄存器,但我还没有找到正确的方法。希望你们能发现错误!
发布于 2021-02-14 15:37:24
非常感谢Nate,问题确实是我在调用ft_putnbr而不是rdx之前推送了rdi。因此,在调用之后,rdx被重置,所以我只是将0复制到rdi到putchar中。此细分市场:
push rdi
mov rdi, rax ; mov rax to rdi to do next iteration putnbr with
call _ft_putnbr
pop rdi
应该是:
push rdx
mov rdi, rax ; mov rax to rdi to do next iteration putnbr with
call _ft_putnbr
pop rdx
我还将更改我的putchar,虽然到目前为止这是有效的,但我知道这是不好的做法
https://stackoverflow.com/questions/66168379
复制相似问题