如何在nasm汇编中打印寄存器的值

时间:2015-07-28 04:16:50

标签: assembly 64-bit printf nasm

我试图让用户输入一个数字,然后打印1,2,3 ... [value]

输入数字

后调用以下内容
printnum:
    mov ecx,0                   ;start at 0
    mov bl, [value] 
    jmp printnumloop    


printnumloop:
    cmp     ecx, 0
    jle     actuallyprint
    jmp     menu

actuallyprint:
     mov    rdi, [format]
     mov    edi, ecx
     mov    eax, 0
     call   printf

    mov     rdi, [LC8]
    mov     eax, 0
    call    printf
    add  edx, 1

LC8

LC8:    db  " , ",0

根据调试器,错误在这一行

=> 0x00007ffff7aa8ae3 <+35>:    movdqu xmm0,XMMWORD PTR [rdi]

1 个答案:

答案 0 :(得分:0)

您需要传递字符串的地址,而不是它们的值。不要取消引用formatLC8。现在,您传递的是字符串的前8个字符,而不是指向字符串的指针。在没有更多上下文的情况下很难确定,但看起来您获得段错误的指令可能是printf取消引用格式字符串参数。在您的示例中,字符串的前8个字符恰好是有效的内存地址,因此会发生错误。

actuallyprint:
     mov    rdi, format ; pass pointer to format
     movzx  rsi, ecx ; pass register contents by value
     mov    eax, 0 ; probably don't need this
     call   printf

    mov     rdi, LC8
    mov     eax, 0
    call    printf
    add     edx, 1