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

如何在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功能打印。
  • 输出优化:每个变量打印后添加回车换行,让输出更易读。

编译运行方法

  1. 用MASM或TASM编译:masm env.asm; link env.obj;
  2. 在DOSBox或真实DOS环境下运行生成的.exe文件,就能看到所有环境变量啦!

内容的提问来源于stack exchange,提问作者Caranthir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 07:47:32