You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:50:21