MASM 6.0/MS-DOS环境下主屏幕保存与恢复方案问询
解决MS-DOS汇编中屏幕保存与恢复的问题
针对你在.model small模式下数据段空间不足、无法直接存储屏幕内容的情况,以下是两种实用解决方案:
方案1:磁盘临时文件存储(最易实现)
通过将屏幕内容写入临时文件,避免占用宝贵的数据段内存,退出帮助界面时再从文件读回恢复:
保存屏幕步骤
- 创建临时文件:调用DOS中断
int 21h的3Ch功能生成临时文件,用简短文件名(如SCREEN.TMP)即可。 - 获取视频参数:用BIOS中断
int 10h的0Fh功能获取当前视频模式、列数、行数,计算屏幕缓冲区总字节数(文本模式下每个字符占2字节:ASCII码+属性,总大小=行数×列数×2)。 - 写入屏幕内容:直接访问视频缓冲区段(彩色文本为
B800h,单色为B000h),通过int 21h的40h功能将缓冲区内容写入文件。 - 关闭文件:调用
int 21h的3Eh功能关闭文件。
示例代码片段:
; 数据段仅需定义少量变量 .data TempFileName db 'SCREEN.TMP', 0 FileHandle dw ? VideoMode db ? Columns db ? Rows db ? ScreenSize dw ? ; 现有数据段内容... ; 保存屏幕的代码段 .code SaveScreen: ; 创建临时文件 mov ah, 3Ch mov cx, 0 ; 普通文件属性 lea dx, TempFileName int 21h mov [FileHandle], ax ; 获取当前视频模式与尺寸 mov ah, 0Fh int 10h mov [VideoMode], al mov [Columns], ah mov [Rows], bh ; 计算屏幕总字节数 mov al, [Rows] mul [Columns] shl ax, 1 ; 乘以2(字符+属性) mov [ScreenSize], ax ; 将视频缓冲区内容写入文件 mov ah, 40h mov bx, [FileHandle] mov cx, [ScreenSize] mov dx, 0B800h ; 彩色文本缓冲区,单色替换为0B000h push ds mov ds, dx mov dx, 0 ; 从缓冲区起始位置读取 int 21h pop ds ; 关闭文件 mov ah, 3Eh mov bx, [FileHandle] int 21h ret
恢复屏幕步骤
- 打开临时文件:用
int 21h的3Dh功能以只读模式打开临时文件。 - 读取文件到缓冲区:通过
int 21h的3Fh功能将文件内容写入视频缓冲区。 - 清理临时文件:关闭文件后,用
int 21h的41h功能删除临时文件。
示例代码片段:
RestoreScreen: ; 打开临时文件 mov ah, 3Dh mov al, 0 ; 只读模式 lea dx, TempFileName int 21h mov [FileHandle], ax ; 读取文件内容到视频缓冲区 mov ah, 3Fh mov bx, [FileHandle] mov cx, [ScreenSize] mov dx, 0B800h push ds mov ds, dx mov dx, 0 int 21h pop ds ; 关闭文件 mov ah, 3Eh mov bx, [FileHandle] int 21h ; 删除临时文件 mov ah, 41h lea dx, TempFileName int 21h ret
方案2:扩展内存存储(速度更快)
如果目标系统支持EMS(扩展内存规范)或XMS(扩展内存规范),可以将屏幕内容存入扩展内存,避免磁盘IO的开销:
- EMS检测与使用:调用
int 67h的00h功能检测EMS是否存在,后续用int 67h的子功能分配内存块、映射到常规内存,完成屏幕内容的读写。 - XMS检测与使用:通过
int 2Fh的4300h子功能检测XMS驱动,再用int 2Fh的相关子功能分配、移动扩展内存数据。
该方案实现复杂度较高,但速度远快于磁盘存储,适合对响应速度有要求的场景。
关键注意事项
- 图形模式下,视频缓冲区地址和大小需对应调整(比如VGA 320x200 256色模式的缓冲区为
A000h,大小为64000字节)。 - 可使用DOS的
int 21h的5Ah功能自动生成唯一临时文件名,避免与现有文件冲突。
内容的提问来源于stack exchange,提问作者Mario Augusto
相关产品推荐
相关产品推荐

