【问题标题】:ASM 8086 free segmentASM 8086 空闲段
【发布时间】:2015-07-31 08:32:52
【问题描述】:

我需要一个空闲段来保存数据,哪些段可以免费使用?

我正在尝试将位图数据保存在内存中,位图数据的大小为 64K,因此我想将其保存在单独的段中。

(恐怕我会覆盖使用的段)

(DOS、ASM 8086、TASM 相关)

【问题讨论】:

  • 问题缺乏细节。你认为为什么会使用一个段?在什么情况下您需要免费段?
  • 哪个目标操作系统?如果是 DOS,你可以使用 INT 21h/AH=48h 分配内存。
  • @m0skit0 我编辑了我的问题
  • 不够,说明操作系统以及是否在另一个进程中运行。
  • 我认为你只需要阅读更多关于你的汇编器是如何工作的。 TASM 支持不同的memory models。选择你需要的内存模型,当你为它编写程序集和链接时,它会对段做正确的事情。

标签: assembly x86-16 segment


【解决方案1】:

您可以在可执行文件中分配静态缓冲区,也可以像 Micheal 建议的那样动态分配缓冲区。要静态分配 64K 缓冲区,您需要执行以下操作:

BITMAPBUF SEGMENT PARA PRIVATE
    DB  0ffffh DUP (?)
BITMAPBUF ENDS  

BITMAPBUF2 SEGMENT BYTE PRIVATE
    DB  ?
BITMAPBUF2 ENDS

BITMAPBUF2 段有点破解我正在使用的 TASM 和 TLINK 版本似乎无法正确处理 64K 段的事实。因此,我创建了两个段,链接器将它们彼此相邻放置。

要使用 MS-DOS 动态分配缓冲区,您需要这样的代码:

    mov ah, 48h
    mov bx, 1000h 
    int 21h
    jc  failed
    mov [bitmapbuf_seg], ax

请注意,如果您尝试创建 .COM 文件,这两种方法都会失败。前者是因为 .COM 文件不能大于 64K,而第二个是因为 .COM 可执行文件在启动时会分配所有可用内存(*),因此没有可动态分配的内存。您可以通过在使用 INT 21h/AH=48h 之前释放未使用的内存来解决后面的问题,但更简单的解决方案是构建一个 .EXE。

这里有一些示例代码将 A000:0000 处的 VGA 帧缓冲区的内容复制到缓冲区。根据缓冲区是静态分配还是动态分配,在开始时取消注释两行之一:

    ; mov   ax, BITMAPBUF
    ; mov   ax, [bitmapbuf_seg]
    mov es, ax
    xor di, di
    mov ax, 0a000h
    mov ds, ax
    xor si, si
    mov cx, 8000h
    rep movsw

(*) 实际上它分配了最大的空闲连续内存块,但这通常意味着几乎所有常规内存。

【讨论】:

  • 但是从framebuffer读取非常慢,因为只有framebuffer的写访问被优化了。
【解决方案2】:

如果我们启动一个可执行文件,那么 DOS 会给它所有的空闲内存。但是我们不知道哪个段是真正免费的。因此,如果我们想分配一些内存,我们必须在分配一些内存之前归还我们不需要的所有内存,以确保这些段没有被使用。

          call SETFREE               ; first we have to free the rest of RAM
          mov      bx, 2000h         ; allocate 128 KB
          call GETSPACE
          jc  ERROR
          mov      [NEWSEG], ax      ; store segment address

;------------------------------------
SETFREE:  mov      bx, ss            ; calculating the amount of bytes
          mov      ax, es            ; that our program is needed
          sub      bx, ax            ; for the code, data and stacksize
          mov      ax, sp            ; and free the rest
          add      ax, 0Fh
          shr      ax, 4
          add      bx, ax
          mov      ah, 4Ah
          int    21h
          ret
;------------------------------------
GETSPACE: mov      ah, 48h
          int    21h
          ret

【讨论】:

    猜你喜欢
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-24
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多