DOS环境下C结合内联汇编实现的dos_print打印函数的功能含义是什么?
DOS环境下C结合x86内联汇编打印函数解析
整体功能概述
这个函数是面向16位实模式DOS环境开发的轻量字符串打印工具,通过嵌入x86内联汇编直接对接DOS原生系统调用,无需依赖C标准库的打印能力,即可实现控制台文本输出。
逐行实现逻辑拆解
代码采用GCC兼容的x86内联汇编语法编写,各部分作用如下:
- 函数接口定义:
void dos_print(char *str),接收指向待打印字符串的字符指针作为入参,无返回值。 - 核心汇编指令段:
mov $0x09, %%ah:向AH寄存器写入功能号0x09。内联汇编中%%是转义写法,对应实际x86指令里的%ah寄存器。int $0x21:触发0x21号软中断,这是DOS核心系统调用的统一入口。
- 内联汇编输入绑定规则:
:"d"(str):指定编译器自动将入参str的值加载到DX寄存器中,匹配DOS中断调用对参数存放位置的要求。 - 内联汇编输出规则:空的输出段
:,代表这段汇编执行后不需要向C语言侧返回任何寄存器值,匹配无返回值的函数设计。 - 内联汇编破坏列表:
:"ah":明确告知编译器AH寄存器在汇编执行过程中会被改写,编译器做寄存器分配时不会将需要长期保存的变量存入AH,避免值被中断调用冲掉。
对应中断调用的具体作用
int $0x21软中断下AH=0x09的调用,是DOS原生提供的控制台字符串输出功能,具体行为为:
当系统接收到该中断请求后,会从DX寄存器指向的内存地址开始,逐字节读取字符输出到当前活动控制台,直到遇到内存中的
$字节才停止输出。
输出过程会自动识别制表符、回车等控制字符并按控制台规则渲染,同时默认响应Ctrl+C快捷键,触发常规程序退出流程。
使用注意事项
- 传入的待打印字符串必须以
$作为结束标记,和C语言默认用\0标记字符串结尾的规则不同。如果直接传入C风格的零结尾字符串,程序会持续向后读取内存直到随机遇到值为$的字节,极易出现打印乱码。 - 该调用仅适用于16位实模式环境,在DOS、DOSBox、实模式虚拟机中可正常运行;在32/64位保护模式的现代操作系统上触发0x21中断,会被系统拦截并触发通用保护错误。
- 由于直接对接系统调用,没有C标准库的额外封装,编译生成的程序体积非常小,适合资源受限的纯DOS场景开发。
内容的提问来源于stack exchange,提问作者user15184972
相关产品推荐
相关产品推荐

