汇编esp是什么意思_esp系统是哪个意思_esp是哪些意思?

电脑杂谈  发布时间:2019-09-11 09:04:42  来源:网络整理

汇编esp是什么意思_esp系统是什么意思_esp是什么意思?

下面以一个非常简单的C来进行讲解ASM的推动方法

查看汇编语言实现方式,把程序修改为debug,在int main()行首添加断点打开IDE集成开发软件的CUP视图,进行逐项的运行,和查看你的代码

用这些方式我们可以更加便捷的弄清楚C,C++的词语在汇编下是怎样推动的这些方式可以更加便捷的让我们学懂汇编指令

1.用C实现一个简单的变量调用功能

//filename: demo.c

//0x11=17, 0x21=33,17+23=50

//run value add(9,20) is :50

#include <stdio.h>

int add(int x,int y){return (x+y);}

int main()

int value;

value=add(0x11,0x21);

printf("add(9,20) is :%d",value);

return 0;

2.编译器自动实现的汇编代码如下:

代码上面 C函数体的运行位置

//int main(){

push ebp

mov ebp,esp

//value=add(0x11,0x21)

push 0x11

push 0x21

//call add(int,int)

汇编esp是什么意思_esp系统是什么意思_esp是什么意思?

//int add(int x,int y){

push ebp

mov ebp,esp

//return (x+y);

mov eax,[ebp+ox08]

add eax,[ebp+ox0c]

//}

pop ebp

//value=add(0x11,0x21)

add esp,0x08

push eax

push 0x0040a0e8

//call printf(const ….)

add esp,0x08

//return 0;

xor eax,eax

//}

pop ebp

ret

3.汇编按行一一讲解明细

ebp基地址指针寄存器,常用于指向程序段的入口地址!

esp堆栈指针寄存器,常用于指向堆栈顶元素,也就是每条指令的操作对象,还记得我们之前用C++实现的堆栈吗?

esp简单的讲就是每次指令操作对象的内存地址,每执行一个指令它就会变化的

汇编esp是什么意思_esp是什么意思?_esp系统是什么意思

————————————————————————————————————–

//此代码未运行之前:ebp=0012FFB8,esp=0012FF90,堆栈数据未知

//int main(){

push ebp //是ebp的地址压入堆栈保存出来,esp跟踪堆栈顶元素,由于数据在存储是先从高地址往低地址存放数据

//esp减4位(0012FF90-4=0012FF8C)esp=0012FF8C

mov ebp,esp //esp的地址复制到ebp结果ebp,esp是存放同一地址

程序说明:从C的int main(){开始计算

//此代码未运行以后:ebp=0012FF8C,esp=0012FF8C,堆栈数据是0012FFB8

(push ebp)汇编esp是什么意思,(mov ebp,esp)这两句是保存当前程序现场,以便于用pop ebp,ret来恢复现场

堆栈压入0012FFB8,它是执行这个int main()之前的程序入口地址

————————————————————————————————————-

//value=add(0x11,0x21)

push 0x11 //把0x11(17)压入堆栈,esp减4位(0012FF8C-4=0012FF88)esp=0012FF88

//0x11存入地址:0012FF88

push 0x21 //把0x21(33)压入堆栈,esp减4位(0012FF88-4=0012FF84)esp=0012FF84

//0x21存入地址:0012FF84

程序说明:从C的value=add(0x11,0x21)开始计算

//以上两行读入参数排序是先左边-后左,先调用0x11,再加载0x21

//就是著名的变量的参数读取是用堆栈来释放的实事证明

//此代码运行之前:ebp=0012FF8C,esp=0012FF8C,堆栈数据是0012FFB8

//此代码运行以后:ebp=0012FF8C,esp=0012FF84,堆栈数据是0012FFB8

————————————————————————————————————-

//call add(int,int) //esp自然减4位(0012FF84-4=0012FF80)esp=0012FF80

汇编esp是什么意思_esp系统是什么意思_esp是什么意思?

//int add(int x,int y){

push ebp //ebp的地址压入堆栈,esp自然减4位(0012FF80-4=0012FF7C)esp=0012FF7C

mov ebp,esp //esp的地址复制到ebp结果ebp,esp是存放同一地址

程序说明:从C的int add(int x,int y){开始计算

//此代码运行之前:ebp=0012FF7C,esp=0012FF90,堆栈数据是0012FFB8

//此代码运行以后:ebp=0012FF7C,esp=0012FF7C,堆栈数据是0012FF8C,0012FFB8

(push ebp),(mov ebp,esp)这两句是保存当前程序现场,以便于用pop ebp,ret来恢复现场

堆栈压入0012FF8C,它是执行这个int add(int x,int y)之前的程序入口地址

————————————————————————————————————-

//用EAX进行两个数据的加法运算

//return (x+y);

mov eax,[ebp+ox08] //把数据0x21,移入eax

add eax,[ebp+ox0c] //把数据0x11,与eax原来数据进行累加之后再送入eax,结果eax=0x32也就是50

//[ebp+0x08]怎么得到0x21,计算如下[ebp+ox08]=0012FF7C+8=0012FF84,而0012FF84存放的是0x21,由之间的push 0x21

//[ebp+0x0c]怎么得到0x11,计算如下[ebp+ox0c]=0012FF7C+c=0012FF88,而0012FF88存放的是0x11,由之间的push 0x11

//因计算是对于eax,所以ebp,esp都没有变化

//此代码运行之前:ebp=0012FF7C,esp=0012FF7C,堆栈数据是0012FFB8

//此代码运行以后:ebp=0012FF7C,esp=0012FF7C,堆栈数据是0012FF8C,0012FFB8

————————————————————————————————————-

pop ebp //把堆栈顶数据弹出到ebp,堆栈数据是0012FF8C,结果ebp=0012FF8C,

//esp+4位(0012FF7C+4=0012FF80)esp=0012FF80

ret //退出函数读取,返回到int main() 代码中来ret,

//value=add(0x11,0x21)

esp是什么意思?_esp系统是什么意思_汇编esp是什么意思

add esp,0x08 //esp+8位(0012FF80+8=0012FF8C)esp=0012FF8C,现在ebp=esp=0012FF8C

//退出函数调用时候的收尾动作

//此代码运行之前:ebp=0012FF7C,esp=0012FF7C,堆栈数据是0012FFB8

//此代码运行以后:ebp=0012FF8C,esp=0012FF8C,堆栈数据是0012FFB8

————————————————————————————————————-

push eax //把eax地址保存起来

push 0x0040a0e8 //把50的内存地址压入堆栈,让printf函数去读取并显示出来

//call printf(const ….) //进行以下的printf函数调用,实现明细如上

add esp,0x08 //把esp的内存地址和ebp对齐到一起esp=ebp

//return 0;

xor eax,eax //把eax复位为0,没有保存任何地址

//此代码运行之前:ebp=0012FF7C,esp=0012FF7C,堆栈数据是0012FFB8

//此代码运行以后:ebp=0012FF8C,esp=0012FF8C,堆栈数据是0012FFB8

————————————————————————————————————-

//} //在执行完int main(){}最后一个}后,把以前的地址复原

pop ebp //把堆栈顶数据弹出到ebp,堆栈数据是0012FFB8,结果ebp=0012FFB8,

//esp+4位(0012FF8C+4=0012FF90)esp=0012FF90

ret //退出int main()函数调用

//最后此代码运行以后:ebp=0012FFB8,esp=0012FF90,堆栈数据未知

//首行此代码未运行之前:ebp=0012FFB8,esp=0012FF90,堆栈数据未知

调用完main()函数后,ebp,esp又得到以前的地址,它就可以再次执行以前未运行完的其他程序

调用各个函数时,ebp,esp的工作小结

1.ebp的工作方式调用一个程序的每一个函数时汇编esp是什么意思,都是调用之前用堆栈保存好ebp,调用时候,又恢复ebp

2.esp的工作方式也是跟着ebp的差异互相配合,都是调用之前用esp取变量指令地址,调用时候,又恢复到以前

esp总是动态的指向当前程序运行到的地址!它是随着程序运行时不断变化而变化的


本文来自电脑杂谈,转载请注明本文网址:
http://xinshanjie.com/a/jisuanjixue/article-122494-1.html

    相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...