汇编:无需 malloc 和系统调用的动态内存分配? [FreeDOS应用程序]

标签 assembly dos heap-memory dynamic-memory-allocation x86-16

我的问题是关于汇编中动态内存分配的逻辑(特别是 MASM)。有很多关于这个主题的文章,它们都依赖于 malloc 或 brk 的使用。但是,根据我的理解,malloc作为C语言的一部分,肯定(或者可以)用汇编语言编写。 brk同上,因为它是操作系统的一部分,因此也是用C语言编写的,可以通过汇编进行一对一替换。很久以前,我在 PCMag 上看到一篇关于在 MS-DOS 中使用纯 asm 进行动态内存分配的文章。不幸的是,我已经失去了这篇精彩文章的所有痕迹。现在我正在使用 FreeDOS(可精确启动的 FreeDOS 闪存卡),并且想知道如果有人决定编写自己的内存分配器,该如何进行?不依赖OS机制的内存分配的出发点和逻辑是什么?

最佳答案

当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

关于汇编:无需 malloc 和系统调用的动态内存分配? [FreeDOS应用程序],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56799938/

相关文章:

dos - 并发 DOS + QEMU 通过并行端口模拟丢失数据

c - 纯 DOS 中的重置和关机(不是 Windows 中的命令提示符)

windows - Batch 图灵完成了吗?

c++ - delete[] 导致堆损坏

java - 哪个进入堆栈或堆?

c++ - 如果对象从堆中分配动态内存,当对象超出范围时它会自动取消分配还是我需要析构函数?

c - PEB 地址 (0x07FF 00) 是来自加载进程基地址的 RV 吗?

assembly - 比较击键 - assembly CCS64

assembly - 构建带有递归函数的.so

optimization - 在汇编程序中使用指针偏移是否比递减更快?