NASM x64:尝试扫描字符并将其与字母"y"进行比较



我正在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  

最新更新