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

纯NASM汇编猜数字游戏开发求助:字符输入与屏幕显示问题

解决16位NASM汇编猜数字游戏的输入输出问题

核心实现思路

在16位实模式下,依赖BIOS中断完成屏幕输出与键盘输入:

  • 屏幕输出:用int 0x10的AH=0xE功能(Teletype输出),自动处理光标移动和换行
  • 键盘输入:用int 0x16的AH=0功能读取按键ASCII码,再用AH=0xE回显输入字符到屏幕
  • 随机数生成:借助CMOS时钟秒数(int 0x1A获取),取模10后加1得到1-10的随机数
  • 字符转数字:输入的数字字符(ASCII码48-57)减去48,即可得到对应数值

完整实现代码

org   0
bits  16

section .text
global _start

_start:
    push cs
    pop  ds          ; 让DS指向代码段,确保正确读取字符串

    ; 打印欢迎信息
    mov  si, welcome_msg
    call print_string

    ; 生成1-10的随机数
    call generate_random
    mov  [random_num], al  ; 保存随机数到内存

    ; 提示输入数字
    mov  si, prompt_msg
    call print_string

    ; 读取并回显用户输入
    call read_char
    call print_char        ; 回显输入的字符
    sub  al, 48            ; ASCII转数字('0'-'9' -> 0-9)
    mov  [user_guess], al

    ; 换行
    mov  al, 10
    call print_char
    mov  al, 13
    call print_char

    ; 对比猜测值和随机数
    mov  al, [user_guess]
    cmp  al, [random_num]
    je   correct_guess
    jmp  wrong_guess

correct_guess:
    mov  si, correct_msg
    call print_string
    jmp  exit_program

wrong_guess:
    mov  si, wrong_msg
    call print_string
    ; 输出正确数字
    mov  al, [random_num]
    add  al, 48            ; 数字转ASCII
    call print_char
    mov  si, end_wrong_msg
    call print_string
    jmp  exit_program

; 打印字符串:SI指向字符串起始地址
print_string:
    mov  bx, 0x0007        ; BH=0(页号),BL=7(白字黑底)
.next_char:
    lodsb                  ; 把[SI]加载到AL,SI自增
    test al, al
    jz   .done
    mov  ah, 0x0E
    int  0x10
    jmp  .next_char
.done:
    ret

; 打印单个字符:AL为字符ASCII码
print_char:
    mov  bx, 0x0007
    mov  ah, 0x0E
    int  0x10
    ret

; 读取单个字符:返回AL为字符ASCII码
read_char:
    mov  ah, 0
    int  0x16
    ret

; 生成1-10的随机数:返回AL为随机数
generate_random:
    mov  ah, 0
    int  0x1A              ; 获取系统时间,DX=秒数(0-59)
    mov  ax, dx
    mov  bl, 10
    div  bl                ; AL=商,AH=余数(0-9)
    mov  al, ah
    add  al, 1             ; 转为1-10
    ret

section .data
welcome_msg db 'Welcome To My Guessing Game:', 10, 13, 0
prompt_msg  db 'Pick A Number Between 1 - 10: ', 0
correct_msg db 'Congratulations! You guessed right!', 10, 13, 0
wrong_msg   db 'Wrong guess! The correct number is ', 0
end_wrong_msg db '.', 10, 13, 0

section .bss
random_num  resb 1
user_guess  resb 1

TIMES 512 - ($ - $$) db 0

关键代码说明

  1. 字符串打印函数:print_string通过lodsb逐个读取字符,直到遇到终止符0,调用BIOS中断完成输出
  2. 输入处理:read_char读取按键后,用print_char回显输入,让用户直观看到自己输入的数字
  3. 随机数生成:利用系统时间的秒数取模,无需复杂算法,适合简单游戏场景
  4. 结果判断:对比输入与随机数,分别跳转至正确/错误分支输出提示,错误分支额外显示正确数字

内容的提问来源于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 15:35:20