簡體   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