中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
作者:
标题: [求助]我想访问1M以下的内存 上一主题 | 下一主题
qingtian2008
新手上路





积分 12
发帖 5
注册 2008-11-5
状态 离线
『楼 主』:  [求助]我想访问1M以下的内存 [已使用 LLM 解释]

请教我想访问1M以下的内存,主要是进行读写操作。请问如何操作
(1)前640K,我是通过MCB来获取空闲块的,来读写;
(2)后384K 如何访问呢?
非常感谢!
LLM 解释

1M以下内存访问方案

一、前640KB(常规内存)访问

通过MCB(内存控制块)管理空闲内存是DOS环境下的标准做法:

MCB结构解析

偏移 大小 描述
00h  1字节 状态标志 ('M'=已分配, 'Z'=空闲)
01h  2字节 段大小 (以节/paragraph为单位, 1节=16字节)
03h  8字节 程序名 (空闲块通常为'          ')
0Bh  n字节 内存块数据区

获取空闲块的流程

  1. PSP:0008h获取第一个MCB段地址(通常为0050h
  2. 遍历MCB链(每个MCB的下一个块地址=当前MCB段地址+段大小+1)
  3. 检查状态标志为'Z'的空闲块

示例代码(汇编)

; 查找第一个空闲MCB
mov es, [0080h]      ; PSP段地址,通常在程序段前缀
mov bx, es:[0008h]   ; 获取第一个MCB段地址
next_mcb:
mov es, bx           ; 指向当前MCB
cmp byte ptr es:[00h], 'Z'  ; 检查是否为空闲块
je found_free_block  ; 找到空闲块
mov bx, es:[01h]     ; 获取段大小(节数)
add bx, es           ; 计算下一个MCB地址 (当前段+大小)
inc bx               ; MCB本身占1节
jmp next_mcb
found_free_block:
; es:0Bh 开始为可用内存区

二、后384KB(保留内存区)访问

640KB-1024KB区域包含:

  • VGA/视频缓冲区 (A0000h-BFFFFh)
  • ROM BIOS (C0000h-FFFFFh)
  • 系统保留区 (如扩展BIOS数据区EBDA)

访问方法

  1. 直接段地址访问(适用于已知区域)

    ; 访问VGA文本模式缓冲区 (B8000h)
    mov ax, 0B800h
    mov es, ax
    mov di, 0        ; 屏幕左上角
    mov word ptr es:[di], 0721h  ; 黑底白字显示 '!'
    
  2. 使用DOS内存控制功能

    • 调用INT 21h AH=48h分配内存(可能返回高位内存块)
    • 调用INT 15h AH=88h获取扩展内存大小(但仅适用于1MB以上)
  3. 通过XMS/EMS规范(推荐用于管理高端内存)

    • XMS方法(需要HIMEM.SYS驱动):
      ; 获取XMS控制函数入口
      mov ax, 4300h
      int 2Fh
      cmp al, 80h
      jne no_xms
      mov ax, 4310h
      int 2Fh       ; ES:BX = XMS驱动入口
      
      ; 分配高端内存块
      mov ah, 09h   ; XMS分配函数
      mov dx, size  ; 以KB为单位
      call dword ptr es:[bx]
      jc alloc_failed
      mov seg_highmem, ax  ; AX = 分配的段地址
      
  4. 注意事项

    • 0A0000h-0BFFFFh为视频内存,直接写入会影响显示
    • 0C0000h-0FFFFFh包含ROM和系统硬件映射,随意写入可能导致崩溃
    • 部分区域可能被EMS/XMS驱动占用,需通过相应API查询

三、兼容性建议

  1. 实模式下最大寻址空间为1MB,通过段:偏移方式访问(段×16+偏移)
  2. 使用调试工具如DEBUG.EXE验证内存映射:-d A000:0000
  3. 编写内存检测程序识别可用区域,避免覆盖关键系统数据
  4. 对于286+处理器,可通过保护模式访问更大地址空间,但需处理模式切换

建议优先使用XMS规范管理高端内存,以确保系统稳定性和兼容性。



2009-8-5 00:18
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
defrag
中级用户

痴迷DOS者


积分 456
发帖 570
注册 2004-10-9
状态 离线
『第 2 楼』:   使用 LLM 解释/回答一下

后384K。。。UMB和EMS是页表映射的扩展内存。。。请直接这样访问
VIDEORAM是硬件映射的显存。。。还是直接这样访问即可。。。




DOS不是万能的,没有DOS是万万不能的
自古系统谁无死?留取胆清照汗青!uploadImages/20035317345478982.png
2009-8-17 22:15
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: