我正在NASM x64程序集中编程一个数字猜谜游戏,但最后遇到了一个障碍。我问用户"你想再次播放吗?(y或n(:"当然可以使用scanf来获取角色。当我使用"%c"作为格式时,它只是完全跳过scanf。当我尝试将其输入为十进制,并将其与字母"y"进行比较时,它不起作用。不过,当我只使用1而不是y时,它就起作用了。
我将数据部分下的字母"y"定义为:yes: dd 'y'
这是扫描和比较的代码:
mov rdi, fmt ;expect char (tried decimal too)
mov rsi, playagain ;input variable (playagain: resb 1)
mov al, 0 ;no float
call scanf
;comparison
mov rcx, [playagain] ;move to register to compare
cmp rcx, [yes] ;the letter 'y'
je play ;back to the beginning
我希望这足以说明问题。
问题是您检查的是用于接收scanf
调用结果的变量的地址,而不是内容。
在呼叫scanf
之前,您正确地执行mov rsi, playagain
,但在呼叫之后,您必须执行mov rcx, [playagain]
。
此外,由于使用%c
格式时,scanf只存储1个字节,因此应只比较一个字节(cmp cl, [yes]
(,或以与初始化yes
相同的方式初始化playagain
。
也就是说,以下内容应该有效:
section .data
fmt: db '%c',0
playagain: dd 'n' ; db is enough, but change comparison accordingly
yes: dd 'y'
section .text
play:
mov rdi, fmt
mov rsi, playagain
mov al, 0
call scanf
;comparison
mov ecx, [playagain]
cmp ecx, [yes] ; don't compare more bytes than used for the vars
je play