Я сделал небольшую 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