临时确保局部变量使用的内存空间
  XJfkgOrPVeAD 2023年11月02日 38 0


局部变量只是函数在处理期间临时存储在寄存器和栈中的

        回想一下上一篇博客是不是定义了10个局部变量?这是为了表示存储局部变量的不仅仅是栈,还有寄存器。为了确保c1-c10所需的域,寄存器空闲的时候就会使用寄存器,寄存器空间不足的时候就会使用栈

_TEXT 段定义表示的是 MyFunc

代码清单中的如下内容表示的是向寄存器中分配局部变量的部分

mov    eax,1
mov eax,2
mov eax,3
mov eax,4
mov eax,5

编译器

        x86系列CPU拥有的寄存器中,程序可以操作的是十几,其中空闲的最多会有几个。因而,局部变量超过寄存器数量的时候,可分配的寄存器就不够用了,这种情况下,编译器就会把栈派上用场,用来存储剩余的局部变量

        在上述代码这一部分,给局部变量c1-c5分配完寄存器后,可用的寄存器数量就不足了。于是,剩下的5个局部变量c6-c10就被分配给了栈的内存空间。如下面代码所示:

mov     dword ptr [ebp-4],6
mov dword ptr [ebp-8],7
mov dword ptr [ebp-12],8
mov dword ptr [ebp-18],9
mov dword ptr [ebp-20],10

add esp,-20 指的是,对栈数据存储位置的esp 寄存器(栈指针)的值做减20的处理。为了确保内存变量c6-c10在栈中,就需要保留5个int类型的局部变量(4字节*5=20字节)所需的空间。mov ebp,esp 这行指令表示的意思是将esp 寄存器的值赋值到ebp 寄存器。之所以需要这么处理,是为了通过在函数出口处 mov esp ebp

临时确保局部变量使用的内存空间_内存空间

 用于局部变量的栈空间的申请分配和释放:

mov     dword ptr [ebp-4],6
mov dword ptr [ebp-8],7
mov dword ptr [ebp-12],8
mov dword ptr [ebp-18],9
mov dword ptr [ebp-20],10

mov,ebp,esp 这个处理,esp寄存器的值被保存到了esp寄存器中,因此,通过使用[ebp-4]、[ebp-8]、[ebp-12]、[ebp-16]、[ebp-20]这样的形式,就可以申请分配20字节的栈内空间切分5个长度为4字节的空间来使用。例如、mov dword ptr [ebp-4],6

将栈内存空间进行分割:

临时确保局部变量使用的内存空间_开发语言_02

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
XJfkgOrPVeAD
最新推荐 更多