请求解释实现1-9字符输入显示的C内嵌汇编代码每一行
逐行解释这段C内嵌汇编代码
Hey there! Let's break down this C inline assembly code line by line—first, a quick context: this is DOS-era x86 assembly that uses the DOS interrupt int 21h (the primary way programs called DOS system functions back in the 80s/90s). Each function is selected by setting the ah register to a specific value. This code only works in a DOS environment (like DOSBox or old MS-DOS) since modern OSes don't support DOS interrupts.
First, here's the full code formatted properly:
void main(void){ _asm{ mov ah,8 ;read key no echo int 21h cmp al,‘0’ ;filter key code jb big cmp al,‘9’ ja big mov dl,al ;echo 0 – 9 mov ah,2 int 21h big: } }
Now let's go through each line step by step:
C部分代码
void main(void): 这是程序的入口点。要注意的是,标准C里main应该返回int类型,但这是Turbo C这类老编译器常用的写法。
内嵌汇编块(_asm标记)
_asm是告诉C编译器这里要插入原生x86汇编代码的标记。
mov ah,8- 把数值
8存入ah寄存器。在DOS中断int 21h中,ah=8对应的是**“读取键盘输入但不回显”**的功能——也就是说用户按下按键后,系统会捕获输入,但不会立刻在屏幕上显示出来。
- 把数值
int 21h- 触发DOS中断,执行我们通过
ah=8选中的功能。执行完成后,用户按下按键的ASCII码会被存在al寄存器里(ax寄存器的低8位)。
- 触发DOS中断,执行我们通过
cmp al,‘0’- 把
al里的内容(按键的ASCII码)和字符'0'的ASCII码(十进制48)做比较,这是第一步过滤:判断输入是不是小于数字'0'。
- 把
jb bigjb是**“无符号小于则跳转”**的指令。如果刚才的比较结果是al的值小于'0'(比如用户按了字母、符号或者控制键),就跳转到big:标签的位置,跳过后续的显示逻辑。
cmp al,‘9’- 再次把
al里的内容和字符'9'的ASCII码(十进制57)做比较,判断输入是不是大于数字'9'。
- 再次把
ja bigja是**“无符号大于则跳转”**的指令。如果al的值大于'9',同样跳转到big:标签,不执行显示操作。
mov dl,al- 能走到这一步,说明输入是0-9之间的数字。我们把
al里的ASCII码复制到dl寄存器——因为DOS的显示功能要求要输出的字符存在dl里。
- 能走到这一步,说明输入是0-9之间的数字。我们把
mov ah,2- 把
ah设为2,这对应int 21h的**“显示单个字符”**功能。
- 把
int 21h- 再次触发DOS中断,系统会把
dl里的字符输出到屏幕上,也就是把用户刚才输入的有效数字回显出来。
- 再次触发DOS中断,系统会把
big:- 这是一个跳转标签,作为不符合输入条件时的跳转目标。跳转到这里后,会直接退出汇编块,程序也就结束了。
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

