public main main proc near push ebp mov ebp, esp and esp, 0FFFFFFF0h sub esp, 30h mov dword ptr [esp], 8 ; size call _malloc mov [esp+2Ch], eax mov dword ptr [esp+4], 4 mov eax, [esp+2Ch] mov [esp], eax call __start
上面的代码代表了我正在处理的大型项目的一部分。 我试图将此代码转换为C等效,但我很难理解malloc的工作原理。
我估计8个字节将是被分配的内存的大小; 但是,我不确定这条线。
mov eax, [esp+2ch]
malloc对eax做了什么?
那么这是等效的C代码吗?
int main(void) { int *ptr1; ptr1 = (int *)malloc(sizeof(8)); *ptr1 = 4; __start(*ptr1);
函数malloc()将分配一个size
字节大的内存块。 如果可以分配所请求的存储器,则将指针返回到存储器块的开头。
注意:未初始化接收的内存块的内容。
malloc()的语法:
void * malloc(size_t size);
参数:
内存块的大小(以字节为单位)。
返回值:
如果请求成功,则返回指向内存块的指针。 如果函数未能分配所请求的内存块,则返回NULL,也可以通过成功调用大小为零的malloc()
返回NULL。
正如Lawlor博士在CS 301讲座中所述 :
从汇编语言调用Malloc
这是一个非常简单的function:在rdi中传递你想要的BYTES数量作为唯一参数。 “打电话给malloc。” 您将获得指向rax中返回的已分配字节的指针。 要事后清理空间,将指针复制到rdi,然后“免费调用”(我在下面留下免费的,因为你需要堆栈才能正确完成)。
这是汇编内存访问的完整示例。 我调用malloc来获取40个字节的空间。 malloc在rax(64位版本的eax)中返回此空间的起始地址。 也就是说,rax寄存器就像一个指针。 然后我可以使用通常的汇编括号语法从指向内存中读取和写入:
mov edi, 40; malloc's first (and only) parameter: number of bytes to allocate extern malloc call malloc ; on return, rax points to our newly-allocated memory mov ecx,7; set up a constant mov [rax],ecx; write it into memory mov edx,[rax]; read it back from memory mov eax,edx; copy into return value register ret
您可以指定要使用括号前面的“DWORD”进行32位内存写入和读取,而不是通过ecx寄存器进行复制,如下所示:
mov edi, 40; malloc's first (and only) parameter: number of bytes to allocate extern malloc call malloc ; on return, rax points to our newly-allocated memory mov DWORD [rax],7; write constant into memory mov eax,DWORD [rax]; read it back from memory ret
对于汇编语言中的malloc,请参见此链接malloc
需要了解更多c/c++开发分享_malloc在assembly中到底做了什么?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享_malloc在assembly中到底做了什么?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980552.html