程序_通过汇编了解程序的实际构成
首先引出一个问题
void sum (int a, int b)
{ a+b;
}
- 1
- 2
- 3
- 4
这个函数运用正确
为什么,但是我的疑惑是我在函数里面并没有定义a,b。这个两个参数只是传进来。为什么可以运用那。
我们可以通过汇编来很好的解释 函数调用的过程。
1、汇编语言是一些助记符的编程语言。
2、通过底下两个函数来来分析下汇编: ##(x86环境)
//返回两个参数值之和的函数
int AddNum(int a,int b)
{ return a+b;
}
- 1
- 2
- 3
- 4
- 5
//调用AddNum函数的函数
void MyFunc()
{ int c; c = AddNum(123,456);
}
- 1
- 2
- 3
- 4
- 5
- 6
__AddNum proc near
int AddNum(int a,int b)
在函数内部利用的寄存器,要尽量返回到函数调用前的状态。为此,我们就需要将其战术保存在栈中,然后再在函数处理完毕前出栈,使其返回到原理的状态。
这里强调一点:
参数是通过栈来传递的,返回值是通过寄存器来返回的。
push ebp
mov ebp,esp
- 1
- 2
- 3
{
return a+b;
mov eax,dword ptr [ebp+8]
add eax,dword ptr [ebp+12]
- 1
- 2
}
pop ebp
ret
- 1
- 2
- 3
__AddNum endp
__MyFunc proc near
void MyFunc()
push ebp
mov ebp,esp
- 1
- 2
- 3
{
int c;
c = AddNUm{123,456};
这里的参数是通过push入栈的
C语言规定是位于后面的数值先入栈。
汇编语言中函数名表示是所在的内存地址
下面这个add esp,8 会把栈中存储的两个参数(456和123)进行销毁,虽然内存中的数据实际还存在着,但只要把esp寄存器的值更新为数据存储地址前面的数据位置,该数据就相当销毁了。
push 456
push 123
call _AddNum
add esp,8
- 1
- 2
- 3
- 4
}
pop ebp
ret
__MyFunc endp
3、不会换成本地代码的伪指令
伪指令负责把程序的构造及汇编的方法指示给汇编器
源代码的开始位置,定义了3个名称分别为
__TEXT(指令的段定义)
__DATA(有初始值的数据段定义)
__BSS(是尚未初始化的数据的段定义)
文章来源: xuesong.blog.csdn.net,作者:内核笔记,版权归原作者所有,如需转载,请联系作者。
原文链接:xuesong.blog.csdn.net/article/details/78698155
- 点赞
- 收藏
- 关注作者
评论(0)