scanf не работает нормально с qword в сборке - PullRequest
1 голос
/ 03 апреля 2020

Я сделал небольшую 64-битную программу сборки NASM в Ubuntu для проверки функции 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 никогда не находит в числе отрицательное значение, когда я печатаю, например -1 для scanf. Но дело в том, что если я изменю определение числа как dw вместо dq (и то же самое в cmp, меняя qword на dword), программа будет работать нормально!

Ниже команд для сборки, связывания и выполнения:

nasm test.asm -f elf64
gcc test.o -no-pie
./a.out

1 Ответ

2 голосов
/ 03 апреля 2020

Вы вызываете scanf с% d, который соответствует указателю на int. Тип int обычно 32-битный (dword), а не 64-битный (qword). Измените numFormat на «% ld», и он будет работать так, как вы ожидаете.

...