如何在DOS汇编程序中获取并打印环境变量?
获取并打印DOS环境变量的汇编实现方案
嘿,我刚好折腾过DOS下的环境变量读取,给你一套完整的汇编代码,直接就能编译运行看到效果!
核心原理
DOS程序的**PSP(程序段前缀)**偏移0x2C位置,存放着当前程序环境块的段地址。环境块本身是一串以0结尾的字符串集合,每个字符串格式是变量名=变量值,最后以连续两个0标记结束。我们要做的就是定位到这个段,然后逐个遍历打印每个环境变量。
完整汇编代码(MASM/TASM兼容)
.MODEL SMALL .STACK 100h .DATA ; 临时存储要打印的字符串,结尾用$供DOS中断调用 temp_buf db 255 dup(?), '$' .CODE MAIN PROC mov ax, @DATA mov ds, ax ; 获取环境块的段地址:PSP的0x2C偏移处的值 mov ax, 0h ; PSP段地址默认是0(程序加载时DS指向PSP,这里也可以用mov ax, ds) mov es, ax mov bx, es:[2Ch] ; ES:BX指向环境块的起始位置 mov ds, bx ; 将DS切换到环境块所在段 mov si, 0h ; SI作为环境块的偏移指针 PRINT_ENV_LOOP: ; 检查当前字符是否为0(单个0是变量分隔,两个0是结束) mov al, [si] cmp al, 0h je CHECK_END ; 如果是0,跳转到检查是否是结束标记 ; 将当前字符复制到临时缓冲区 mov di, 0h COPY_CHAR: mov al, [si] cmp al, 0h je PRINT_TEMP ; 遇到0,说明当前变量字符串结束,准备打印 mov temp_buf[di], al inc si inc di jmp COPY_CHAR PRINT_TEMP: ; 调用DOS中断21h的09h功能打印字符串(以$结尾) mov ah, 09h lea dx, temp_buf int 21h ; 打印换行和回车,让输出更整洁 mov ah, 02h mov dl, 0Dh ; 回车符 int 21h mov dl, 0Ah ; 换行符 int 21h ; 跳过当前的0分隔符,继续下一个变量 inc si jmp PRINT_ENV_LOOP CHECK_END: ; 检查下一个字符是否也是0,若是则结束循环 inc si mov al, [si] cmp al, 0h je EXIT_PROGRAM ; 如果不是双0,说明只是单个分隔符,继续遍历 jmp PRINT_ENV_LOOP EXIT_PROGRAM: ; 调用DOS中断退出程序 mov ah, 4Ch int 21h MAIN ENDP END MAIN
代码说明
- 环境块定位:通过PSP的
0x2C偏移拿到环境段地址,切换DS到该段后就能直接访问环境变量字符串。 - 遍历逻辑:逐个字符读取,遇到
0就判断是变量分隔还是结束标记,复制到临时缓冲区后用DOS中断21h的09h功能打印。 - 输出优化:每个变量打印后添加回车换行,让输出更易读。
编译运行方法
- 用MASM或TASM编译:
masm env.asm; link env.obj; - 在DOSBox或真实DOS环境下运行生成的
.exe文件,就能看到所有环境变量啦!
内容的提问来源于stack exchange,提问作者Caranthir
相关产品推荐
相关产品推荐

