纯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
关键代码说明
- 字符串打印函数:
print_string通过lodsb逐个读取字符,直到遇到终止符0,调用BIOS中断完成输出 - 输入处理:
read_char读取按键后,用print_char回显输入,让用户直观看到自己输入的数字 - 随机数生成:利用系统时间的秒数取模,无需复杂算法,适合简单游戏场景
- 结果判断:对比输入与随机数,分别跳转至正确/错误分支输出提示,错误分支额外显示正确数字
内容的提问来源于stack exchange,提问作者MastersProgression
相关产品推荐
相关产品推荐

