scanf在汇编中的qword上无法正常工作

问题描述 投票:1回答:1

我在Ubuntu中制作了一个64位的NASM汇编程序来测试scanf C函数,但是如果目标字段是qword,则无法正常工作。

global  main
extern  printf
extern  scanf
section         .data
    msgInNum        db  'Type a number: ',0
    numFormat       db  '%d',0
    msgOuNum        db  'Your input %d ',10,0
    number          dq  0
section         .bss
section         .text
main:
    push rbp
other:
    mov     rdi,msgInNum
    xor     rax,rax
    call    printf

    mov     rdi,numFormat
    mov     rsi,number
    mov     al,0
    call    scanf

    mov     rdi,msgOuNum
    mov     rsi,[number]
    xor     rax,rax
    call    printf

    cmp     qword[number],0
    jge     other

    pop rbp
    ret

问题是程序永远不会结束,因为当我键入时,cmp指令永远不会发现负数,例如scanf为-1。但问题是,如果我将数字的定义更改为dw而不是dq(并且在cmp中用dword更改qword的方法相同),程序运行正常!

以下命令进行汇编,链接和执行:

nasm test.asm -f elf64
gcc test.o -no-pie
./a.out
assembly scanf 64-bit x86-64 nasm
1个回答
2
投票

您正在用%d调用scanf,它与一个指向int的指针相对应。一个int通常是32位(dword)而不是64位(qword)。将numFormat更改为'%ld',即可正常使用。

© www.soinside.com 2019 - 2024. All rights reserved.