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

MASM 6.0/MS-DOS环境下主屏幕保存与恢复方案问询

解决MS-DOS汇编中屏幕保存与恢复的问题

针对你在.model small模式下数据段空间不足、无法直接存储屏幕内容的情况,以下是两种实用解决方案:

方案1:磁盘临时文件存储(最易实现)

通过将屏幕内容写入临时文件,避免占用宝贵的数据段内存,退出帮助界面时再从文件读回恢复:

保存屏幕步骤

  1. 创建临时文件:调用DOS中断int 21h的3Ch功能生成临时文件,用简短文件名(如SCREEN.TMP)即可。
  2. 获取视频参数:用BIOS中断int 10h的0Fh功能获取当前视频模式、列数、行数,计算屏幕缓冲区总字节数(文本模式下每个字符占2字节:ASCII码+属性,总大小=行数×列数×2)。
  3. 写入屏幕内容:直接访问视频缓冲区段(彩色文本为B800h,单色为B000h),通过int 21h的40h功能将缓冲区内容写入文件。
  4. 关闭文件:调用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

恢复屏幕步骤

  1. 打开临时文件:用int 21h的3Dh功能以只读模式打开临时文件。
  2. 读取文件到缓冲区:通过int 21h的3Fh功能将文件内容写入视频缓冲区。
  3. 清理临时文件:关闭文件后,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:15:33