首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86_64英特尔putnbr仅正确打印第一个数字

x86_64英特尔putnbr仅正确打印第一个数字
EN

Stack Overflow用户
提问于 2021-02-12 16:17:45
回答 1查看 59关注 0票数 1

我刚开始使用asm,正在尝试编写一些基本的函数,看起来我的write、putchar和putstr都可以工作,但是我的putnbr打印不正确。当我尝试正片nbr时,它只打印第一个nbr,对于所有其他nbr,它打印0,当我打印负片nbr时,它打印400000之类的东西。我的putchar代码如下:

代码语言:javascript
运行
复制
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中使用的逻辑相同:

代码语言:javascript
运行
复制
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上部分工作,而不是他们的四字寄存器,但我还没有找到正确的方法。希望你们能发现错误!

EN

Stack Overflow用户

发布于 2021-02-14 15:37:24

非常感谢Nate,问题确实是我在调用ft_putnbr而不是rdx之前推送了rdi。因此,在调用之后,rdx被重置,所以我只是将0复制到rdi到putchar中。此细分市场:

代码语言:javascript
运行
复制
    push    rdi
    mov     rdi, rax     ; mov rax to rdi to do next iteration putnbr with
    call    _ft_putnbr
    pop     rdi

应该是:

代码语言:javascript
运行
复制
    push    rdx
    mov     rdi, rax     ; mov rax to rdi to do next iteration putnbr with
    call    _ft_putnbr
    pop     rdx

我还将更改我的putchar,虽然到目前为止这是有效的,但我知道这是不好的做法

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66168379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档