【问题标题】:Using memory returned by call to malloc in NASM在 NASM 中使用调用 malloc 返回的内存
【发布时间】:2011-04-05 03:23:10
【问题描述】:

我正在使用 nasm 编译器将我的代码编译成一个目标文件,然后调用 gcc 的链接器来链接该目标文件以创建最终的可执行文件。这意味着我可以访问 C 的运行时库。

我需要进行动态内存分配,所以我正在调用 malloc,如下所示

push 20 ;push amount of bytes malloc should allocate    
call _malloc ;call malloc
add esp,4 ;undo push

分配的内存地址在 eax 寄存器中返回,但是我如何使用该地址用值初始化该位置?

我的程序的目的是让用户指定他们想输入多少个数字,然后为每个数字动态创建空间。理想情况下,我希望创建一个与用户指定的确切大小匹配的数组,并能够遍历该数组。

【问题讨论】:

    标签: assembly malloc nasm


    【解决方案1】:

    malloc 分配内存后,eax 的值只是一个可以使用的指针。例如,要将值写入那里的前两个 32 位 ints,您可以这样做:

    mov dword ptr [eax], 0
    mov dword ptr [eax + 4], 1
    

    【讨论】:

    • 非常感谢,我完全错过了 dword,所以对组装很陌生。
    • @Mark:仅当您输入常量而不是存储寄存器值时才需要这样做(因为寄存器具有已知大小而常量不知道)。
    【解决方案2】:
    push 20                ; push amount of bytes malloc should allocate    
    call _malloc           ; call malloc
    test eax, eax          ; check if the malloc failed
    jz   fail_exit         ; 
    add esp,4              ; undo push
    mov [eax], dword 0xD41 ; 'A\n'
    

    不管怎样,我建议你看看this tutorial,它有一些很有趣的东西:

    该程序打印“Hello World”,使用 malloc 分配一些内存,使用该内存在屏幕上写入 10 个字母(使用 printf),释放内存,然后返回。

    【讨论】:

      猜你喜欢
      • 2015-06-14
      • 2016-02-28
      • 2023-04-05
      • 2019-01-05
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      相关资源
      最近更新 更多