【问题标题】:Printing integers in assembly with NASM使用 NASM 在汇编中打印整数
【发布时间】:2015-09-16 05:51:36
【问题描述】:

我正在尝试在带有 nasm 的程序集中使用 printf 打印“12345”。它保持印刷时代。我基于我们所做的实验室打印了一个计数器数字(只有一个数字)并且它有效。

我必须使用除以 10 的方法吗,或者这是否接近打印“12345”的设置方式

    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

;mov    rdi,format
;push count
;push format    
mov rax, 12345
push rax
push format 
;mov    al,0
call    printf
;add esp,8  
;ret


    ; 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

format  db  '%d',10,0

【问题讨论】:

  • 64 位调用约定不使用堆栈来传递前几个参数。
  • 还请记住,使用 C 调用约定,您是负责在调用后从堆栈中删除最终参数的人。

标签: assembly integer printf nasm


【解决方案1】:

您是否只是想将 12345 打印到您的终端。也许我错过了什么。

section .data
        fmt:    db      `%d\n`
section .text
        global main
        extern printf
main:
        ;  x86_64 rdi rsi rdx rcx r8 r9
        mov rsi, 12345
        call _write

_exit:
        mov rax, 60
        xor rdi, rdi
        syscall

_write:
        push rbp
        mov rbp, rsp
        lea rdi, [fmt]
        xor rax, rax
        call printf
        xor rax, rax
        leave
        ret           

输出:

$ ./user3866044_001
12345

【讨论】:

    【解决方案2】:

    答案取决于操作系统。在 Windows x64 程序集中,您使用一些寄存器,而不是向堆栈传递参数。将第一个参数 format 移动到 rcx 并将第二个参数 rax 移动到 rdx。对于 Linux,使用 rdi 代替 rcx 和 rsi 代替 rdx。

    【讨论】:

      猜你喜欢
      • 2011-10-17
      • 2015-09-17
      • 2013-12-14
      • 2019-07-06
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多