assembly - 使用 printf 在汇编 NASM 中打印数字

标签 assembly printf nasm x86-64 calling-convention

我已经尝试让它打印 12345 一段时间了。任何人都可以提示我应该做什么吗?它将打印三行文本,然后在第四行打印“age”,我猜测它是第 2 行堆栈中的剩余内容。

    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] ; 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";

关于assembly - 使用 printf 在汇编 NASM 中打印数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31143237/

相关文章:

algorithm - 如何比较同一算法的两个实现? (通过检查他们的汇编代码)

c++ - 程序集 : main:nop vs main proc

c - Snprintf 在 C 中不工作

C 使用 NASM 指向 EFLAGS 的指针

assembly - NASM x86_64 scanf 段错误

assembly - 我可以使用二进制在汇编中编写整数常量吗?

c - 搜索短排序的 double 组

C++ 自定义调用约定

c - 我用scanf获取输入,我用printf检查输入....然后我去用的时候输入不正确

c - 我可以读到文件中有 *are* 个字符,但不能将它们打印到另一个文件