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