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