汇编:没有malloc和syscall的动态内存分配?[FreeDOS应用程序]

ten*_*hiz 4 assembly dos heap-memory dynamic-memory-allocation x86-16

我的问题是关于程序集(尤其是MASM)中动态内存分配的逻辑。关于此主题的文章很多,所有文章都依赖于malloc或brk的使用。但是,根据我的理解,必须(或可以)将malloc作为C语言的一部分,用汇编语言编写。等同于brk,因为它是操作系统的一部分,因此也写在C上,可以用汇编1对1替换。很久以前,我在PCMag中看到了一篇有关使用纯asm在MS-DOS中进行动态内存分配的文章。不幸的是,我已经失去了这段精彩作品的所有痕迹。现在我' m与FreeDOS(可精确引导的FreeDOS闪存卡)一起工作,并且想知道如果有人决定编写自己的内存分配器该如何进行?不依赖操作系统机制的内存分配的起点和逻辑是什么?

rcg*_*ldr 6

DOS加载.COM程序时,它将640KB区域(低于0a000h:00000h)中的所有可用内存分配给该程序,并且该程序可以管理自己的内存。如果需要使用MSDOS内存管理,则程序首先必须使用释放内存INT 21H, AH=49H, ES=segment, BX=# paragraphs。然后INT 21H, AH=48H, BX=# paragraphs,它可以使用分配内存。

如评论中所述,.EXE程序可能会或可能不会分配640KB区域中的所有内存。

示例.COM汇编代码,以释放,然后分配所有可用内存。MSDOS通常会消耗16个字节的开销。在此示例中,BX将其设置为代码的末尾,然后设置为下一个段落边界,该边界位于代码末尾之后256个字节,以用作堆栈空间。该堆栈的末尾是INT 21H, AH=4AH调用释放的内存的基础。

        .286
        .model  tiny,c
        .code
        org     0100h
;       cs,ds,es,ss = program segment prefix, sp = 0fffeh
start:  mov     bx,offset cdend         ;set bx=end stack
        add     bx,0010fh
        and     bx,0fff0h
        mov     sp,bx                   ;sp = new end of stack
        mov     cl,4                    ;release memory
        shr     bx,cl
        mov     ax,04a00h
        int     21h
        mov     ax,04800h               ;set bx = available memory
        mov     bx,0ffffh
        int     21h
        mov     ax,04800h               ;allocate all of it
        int     21h                     ; returns segment in ax
exit:   mov     ax,04c00h               ;exit
        int     21h
cdend:
        end     start
Run Code Online (Sandbox Code Playgroud)

  • EXE程序有一些例外,它们并不要求在加载时分配所有内存。这取决于用于生成可执行文件的工具或EXEMOD程序的使用。碰巧的是,许多工具使用的MAXALLOC值为0xffff,可以分配所有内存。尽管COM程序始终分配有所有内存。内存限制也有所不同,并且由于各种原因可能会高于或低于A000。分配给程序的内存后的段落可以在PSP中的偏移量0x0002处找到 (3认同)
  • MS-DOS还仅分配可用的最大可用内存块。尽管通常不大可能,但可能存在可能使常规内存碎片化的现有分配。EBDA可以使用常规内存末尾的内存的可能性更大。TSR和设备驱动程序有时还会在常规内存的末尾分配内存,以避免碎片。 (3认同)
  • @rossridge:DOS做的另一件事...如果程序在EXE的MZ标头中具有MINALLOC = MACALLOC = 0,则DOS会尝试将程序加载到可用内存的顶部而不是底部 (3认同)
  • 这些问题中的一些在此SO答案中进行了讨论:/sf/answers/3972309631/ (2认同)