gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:36:54 26 4
gpt4 key购买 nike

我的问题是关于汇编中动态内存分配的逻辑(特别是 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com