NASM汇编内核猜数字游戏条件判断错误问题及修正方案
问题与解决:NASM汇编猜数字游戏条件判断修复
我尝试用NASM汇编编写一个基于内核的猜数字游戏,引导程序仅指向内核文件,游戏的所有函数与变量均存储在内核中。目前已实现游戏说明信息的打印功能,但遇到条件判断逻辑问题:无论输入的数字是否正确,程序都会输出获胜提示。需要让内核仅在用户输入正确数字时才显示对应的获胜提示。
初始问题代码
org 0 bits 16 _start: push cs pop ds mov si, msg jmp BeginLoop PrintLoop: mov ah, 0x0E int 0x10 BeginLoop: mov al, [si] inc si or al, al jz GameLoop test al, al jnz PrintLoop GameLoop: xor ax, ax int 16h mov ah, 0x0E int 0x10 cmp ax, 0x5 jne GameWon GameWon: mov si, won mov al, [si] inc si or al, al jz GameLoop test al, al jnz PrintLoop cli hlt jmp $-2 msg db 'Welcome To My Guessing Game: ', 10, 13, 'Pick A Number Between 1 - 10 ', 10, 13, 0 won db 'You Guessed The Correct Number!', 10, 13, 0 loss db 'You Guessed The Incorrect Number!' 10, 13 TIMES 512 - ($ - $$) db 0
问题分析
- 判断逻辑完全颠倒:
cmp ax, 0x5后用jne GameWon,意思是“输入不等于0x5就跳转到获胜”,与需求完全相反;且0x5并非数字5的ASCII码(数字0-9的ASCII范围是0x30-0x39),判断对象错误。 - 缺失失败分支处理:代码未定义失败后的提示逻辑,无论判断结果如何,最终都会执行
GameWon段代码。 - 无随机数机制:固定判断值0x5,游戏无随机性,不符合猜数字游戏的基本需求。
修正后可运行代码
org 0 bits 16 _start: push cs pop ds mov si, msg jmp Print GameLoop: ; 利用系统时间生成0-9的随机数 mov ah, 00h int 1ah mov ax, dx xor dx, dx mov cx, 10 div cx add dl, '0' ; 读取用户输入并回显 mov ah, 0x00 int 16h mov ah, 0x0E int 0x10 GameCondition: ; 比较输入的ASCII码与随机数的ASCII码 mov si, won cmp al, dl je GameWon jmp GameLost GameLost: mov si, loss jmp Print GameWon: jmp Print Print: jmp BeginLoop PrintLoop: mov ah, 0x0E int 0x10 BeginLoop: mov al, [si] inc si or al, al jz GameLoop test al, al jnz PrintLoop ret ; ------------------- msg db 'Welcome To My Guessing Game: ', 10, 13, 'Pick A Number Between 0 - 9 ', 10, 13, 0 won db 'You Guessed The Correct Number!', 10, 13, 0 loss db 'You Guessed The Incorrect Number!', 10, 13, 0 times 512 - ($-$$) db 0
修正说明
- 修复判断逻辑:将输入的ASCII码与随机数转换后的ASCII码对比,用
je GameWon实现“相等则跳转获胜”,jmp GameLost处理失败场景。 - 添加随机数生成:调用
int 1ah获取系统时间的dx寄存器值,通过除法取余得到0-9的随机数,再转换为ASCII码用于对比。 - 重构打印逻辑:将打印字符串的逻辑抽离为独立段,代码结构更清晰、可复用。
- 补全失败提示:完善
loss字符串的定义(添加0终止符),并实现失败后的提示流程。
内容的提问来源于stack exchange,提问作者MastersProgression
相关产品推荐
相关产品推荐

