NASM x64:尝试扫描字符并将其与字母 'y' 进行比较
NASM x64: trying to scanf a character and compare it to the letter 'y'
我正在用 NASM x64 程序集编写一个数字猜谜游戏,但我在最后遇到了障碍。我问用户 "Do you want to play again?(y or 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]
),或者像下面这样初始化playagain
你初始化 yes
.
I.e.the 以下应该有效:
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
我正在用 NASM x64 程序集编写一个数字猜谜游戏,但我在最后遇到了障碍。我问用户 "Do you want to play again?(y or 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]
),或者像下面这样初始化playagain
你初始化 yes
.
I.e.the 以下应该有效:
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