assembly 使用printf在程序集NASM中打印编号

v6ylcynt  于 2022-11-24  发布在  其他
关注(0)|答案(1)|浏览(195)

我已经尝试打印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
0vvn1miw

0vvn1miw1#

显然,您甚至不知道printf是如何工作的,这使得很难从汇编中调用它。
要打印一个数字,printf需要两个参数,一个格式字符串和要打印的数字。例如:printf("%d\n", 12345) .
现在要将其转换为程序集,显然需要声明该格式字符串,然后使用适当的约定传递两个参数。
由于您似乎正在使用sysv abi,这意味着前两个参数分别进入rdirsi。您似乎已经知道必须将al清零以指示未使用SSE寄存器。因此,相关部分可能如下所示:

lea rdi, [rel fmt] ; address of label
mov rsi, 12345     ; or mov rsi, [count]
xor eax, eax       ; AL=0
call printf
...

section .rodata
fmt: db "%d", 0x0a, 0    ; char fmt[] = "%d\n";

相关问题