繁体   English   中英

使用printf在装配NASM中打印号码

[英]Printing a number in assembly NASM using printf

我一直在尝试将其打印12345。 谁能提供我应该做什么的提示? 它将打印三行文本,然后在第四行上打印“ age”,我猜这是第二行中堆栈中的剩余内容。

    bits 64
    global main
    extern printf

    section .text
main:
    ; function setup
    push    rbp
    mov     rbp, rsp
    sub     rsp, 32
    ;
    lea     rdi, [rel message]
    mov     al, 0
    call    printf
;above code correctly prints message

;where the issue lies
push rbp
mov rbp, rsp
;sub rsp, 32

mov rax, 12345
;push rax   
mov al,0
call printf


    ; function return
    mov     eax, 0
    add     rsp, 32
    pop     rbp
    ret

    section .data
message: db      'Lab 3 - Modified Hello program',0x0D,0x0a,'COSC2425 - Pentium assembly language',0x0D,0x0a,'Processed with NASM and GNU gcc',0x0D,0x0a
count   dq  12345

显然,您甚至都不知道printf工作方式,这使得很难从汇编中调用它。

要打印数字, printf需要两个参数,即格式字符串和要打印的数字。 示例: printf("%d\\n", 12345)

现在要将其转换为汇编,您显然需要声明该格式字符串,然后使用适当的约定传递两个参数。

由于您似乎正在使用sysv abi,​​因此这意味着前两个参数分别进入rdirsi 您似乎已经知道必须将al设为零以指示未使用SSE寄存器。 因此,相关部分可能如下所示:

lea rdi, [rel fmt]
mov rsi, 12345 ; or mov rsi, [count]
mov al, 0
call printf
...
fmt: db "%d", 0x0a, 0

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM