在栈(stack)上动态分配内存的一种简单实现方式

本文探讨了如何使用额外的ebp寄存器在栈上动态分配内存的方法。通过对比默认编译器生成的栈操作代码,文章详细解释了如何利用ebp寄存器来保持栈顶指针的初始位置,从而实现对局部变量的有效访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候为了代码的高效性,需要在stack上分配内存。一般而言如果不通过额外的寄存器,只通过esp指针是没法实现在stack的上的内存的动态分配的,因为compile没法通过单纯一个esp指针来实现变量的相对地址的管理。

 

例如要实现如下类似函数:

 

int foo(int n)

{

    int x=100; // assume it's not put in a register.

    char* p=(char*)dynamically_allocate_on_the_stack(n);

    return x;

}

默认情况下compiler生成的stack操作代码是没法完成这个任务的!

 

sub esp,8

mov dword ptr [esp+4], 100 ; assigns a value to x

sub esp, [esp+12] ; dynamically allocates the stuff

mov [esp+???], esp ; assign that to p

mov eax,[esp+???] ; loads x

add esp, ??? ; where could we store the amount of stack used?

ret

 

这样一搞,compiler就疯了,它根本不知道变量x相对于栈顶指针esp的偏移量了,也就没法访问变量x了。

 

为此我们需要引入别的寄存器来解决该问题,一般而言ebp在此就派上用场了

解决方法也是很简单,就是多用一个ebp寄存器来额外保存刚进来时的esp,这样就可以确定变量x的相对地址了。

 

push ebp ; needs to save this register

mov ebp, esp ; this register is now reserved for this usage

sub esp,8 ; stack space for x and p

mov [ebp-4], 100 ; assigns 100 to x

sub esp, [ebp+8] ; allocates space on stack

mov [ebp-8], esp ; assigns it to p

mov eax, [ebp-4] ; loads x

mov esp, ebp

pop ebp ; clean up stack frame

ret

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值