首页 > 编程知识 正文

汇编堆栈使用方法,主堆栈指针

时间:2023-05-03 22:34:14 阅读:119989 作者:3395

% E6 % 9c % AC % E6 % 96 % 87 % E7 % ab % A0 % E7 % B3 % bb % E4 % BD % 9c % E8 % 85 % E5 % 88 % ef % 25 % 20ac % E8 20d % a5 % E8 % af % B4 % E7 % 9a % 84 % E8 % af % 9d % ef % BC % 8c % E5 % E4 % bb % a5 % E6 % 8a % E8 % AE % a1 % 20 % E5 % 8f % ab % E5 % 81 % 9a % E5 % 86 % e9 % 83 % A8 % E5 % E5 % ad % 98 % E5 % 99 % A8 % E7 % 9a % 84 % E4 % bb % 224 5 % E5 % 25 % 206 % 8c % 87 % e9 % 92 % E4 % b8 % E5 % 8f % 98 % E5 % E5 % af % 84 % E5 % ad % 98 % E5 % a8sp %2CBP pu % E4 % b8 % 88 % 20e6% 80 % bb % E7 % ba % BF % E6 % E5 % E8 % a6 % A8 % E5 % 86 % E5 % ad % 98 % e9 % 88 % 25 % 20 % E4 % B9 % 88 % E8 % BF % 99 % E5 % 87 % A0 % E4 % b8 % ae6 % E5 % af % E5 % 82 % E4 % BD % 95 % E5 % 25 ad % 98 % 20d % E2 % 80 % 9c % E6 % ad % a4 % E5 % a4 % E6 % 94 % be7 % ae5 % 9b % be7 % 89 % 87 % E2 % 80 % 90d % 20 % 20 206 % AE % b5 % E7 % 9a % 84 % E8 % b5 % B7 % E5 % a7 % 8b % E5 % 9c % B0 % E5 % 80 % ef % BC % 8c % E5 % 90 % E6 % A0 % % E6 % AE % b5 % E7 % 9a % 84 % E8 % b5 % B7 % E5 % a7 % 8b % E5 % b9c % E5 % E5 % 9d % 80 % E3 % 82 % E4 % 20 % 81 % ef E4 % b8 % ad % E5 % ad % 98 % E5 % 82 % A8 % E3 % 82 % 20 % e9 % a3 % E4 % B9 % 88 % E4 % ba4 % ba4% ba % 20d % ef % BC 205 % 85 % B6 % E4 % b8 % addp % E6 % 98 % af % E5 % 9f % ba % E5 % 9d % 80 % ef % BC % 8c % E4 % b8 % 80 % E8 % 88 % AC % E4 % 8f % 98 % E5 % 25 % 20c % A0 % E5 % 9b % be7 % 89 % ef % 8c % E6 % 98 % be7 % a4 % ba push % E5 % 89 % 8d % E5 % 90 % 25 % ad % 98 % E7 % 20 % 25 % 2086 % E6 % A0 % E6 % AE % b5 % E7 % 9a % E7 % 89 % B9 % E6 % AE % E6 % af % E6 % ba % 90 % E4 80 % A0 % E8 % BF % 99 % ee9 % 25 % 201 % a2 % ef % BC % 9f % E6 % 88 % 91 % E4 % bb % AC % E6 % a5 % E7 % 8b % 80 % E6 % % E5 % 8f % 25 % 209 c % E6 % ad % a4 % E5 % a4 % 84 % E6 % 94 % be4 % b8 % E6 % ae5 % E4 % bb % a3 % E7 % A0 % 81 % ef % BC % E4 % B9 % 88 % E2 % 80 % 9d % 00a % 25 % 208 % E8 % B7 % 9f % E6 % 88 % 91 % E4 % bb % E5 % 9c % A8 % e9 % ab % 98 % E7 % % E5 % a4 % 84 % E7 % 94 % E6 % B1 % 87 % 25 % 20b % B6 % E4 % b8 % E8 % E8 % a1 % 8c % E7 % 84 % E5 % ba % 95 % E5

subl $32,%esp操作通过将esp中的数字减少32来执行

movl $ 1,28 (% esp ) ) ) ) )。

r> movl $2, 24(%esp)
movl $6, 20(%esp)
movl $8, 16(%esp)
movl $10, 12(%esp)
这一串操做就是我们C语言中的变量赋值,我们发现,我们定义的a,b,c,d,e五个变量存储的区域都在ebp与esp所指向的地址之间,a的存储位置是ebp至28+esp(也就是32-28)之间的4个字节,b的存储位置是24-28中间的4个字节,以此类推,我们发现我们在main()函数中定义的变量都被约束在ebp与esp之间。

好,接着往下走,这时候我们调用了子函数def(),首先执行的代码段就是:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
此时我们分析PUSH ebp的作用,这个操作是什么结果呢?就是将ebp中的数据压入栈段,这个操作执行完成之后会变成这样:

也就是将主函数的变量存储空间的基地址压入栈段保护了起来,后执行操作
movl %esp, %ebp
subl $16, %esp
这个操作首先将esp中的数据给了ebp,然后将esp中的数据减去了16,执行完成后是这个样子:

相信大家已经看出来了,这个操作的目的就是给def开辟一段空间来存储def中的变量,这样做可以防止main中的变量收到影响。
在def函数结尾会发生什么呢?我们注意到执行了一个leave指令,这个指令等价于movl %ebp, %esp
pop %ebp
这个指令是将ebp中的数值传给esp,然后从将栈顶的数取出来赋值给ebp。
执行后是这个样子:

这个时候我们看到,ebp跟esp中的值又回到了调用函数之前的样子,这就意味着def函数中定义的空间被释放了,然后在执行调用test函数后,会变成这个样子:

此时test函数使用的变量空间已经将def函数空间给覆盖掉了,这也就是局部变量作用域在函数内部的原因。
至此,变量存储过程分析完毕,下面总结一下:

1.计算机可以简单理解为CPU与内存两部分,二者通过总线连接2.栈段,数据段,代码段都存储于内存中,但是CPU可以通过其内部的寄存器赋予不同的内存空间不同的功能。3.我们在高级语言中定义变量时,其存储范围在编译的时候通过esp减去某值(编译器计算)来确定,在调用函数的过程中可以通过将ebp压栈来保存上一函数的变量其实地址,然后将esp中的值赋予ebp,来保障不会影响上一函数的变量空间,同时,再函数退出时,通过将ebp的值赋予esp以及将栈顶值pop到ebp来释放空间,同时确定上一函数的变量存储空间。4.我们在高级语言学习中常说的栈空间,堆空间,按照上面的论述来看,其实都是内存空间,并且都存在于内存空间里面的数据段,只不过栈空间存储的变量会随着函数的执行而创建与释放,堆空间不会,因为堆空间不受栈段以及esp,ebp的控制,可以通过malloc函数来创建,但是需要程序员编写代码来释放(有可能操作系统会帮忙释放,但不一定)。5.我们在学习C#中常说的值类型变量应该指的就是存在栈空间里的变量,引用类型变量应该就是通过malloc函数创建的值位于堆空间,但是地址位于栈空间的变量。6.Python中的变量类型随着其指向的内存空间的数据类型变化而变化,与上面的论述过程不一样,其原理需要进一步分析。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。