从汇编角度分析C语言的过程调用(3)

enter指令
在AT&T汇编中,enter等效于以下汇编指令:
pushl %ebp # 将%ebp压栈
movl %esp %ebp # 将%esp保存到%ebp, 这两步是函数的标准开头
leave指令
在AT&T汇编中,leave等效于以下汇编指令:
movl %ebp, %esp
popl %ebp
call指令
在AT&T汇编中,call foo(foo是一个标号)等效于以下汇编指令:
pushl %eip
movl f, %eip
ret指令
在AT&T汇编中,ret等效于以下汇编指令:
popl %eip

(个人理解)汇编可以用一句话概括:汇编就是在(寄存器和寄存器)或 (寄存器和内存)之间来回move 数据;就是指:数据在内存和寄存器间来回流动,流动的越频繁就代表程序越复杂,比如office这样的大型软件。

从C语言层面分析: 

EBP-xx     一般 是局部变量

EBP+xx   一般都是参数 

EBP+4  返回地址 ,制高点,   很多攻击都是攻击这里, 杀毒软件,这里是重点会扫描。

C函数堆栈中分配的空间,并不会清零,所以在写C代码的时候,局部变量一定要初始化赋值。

参数的传递形式、传递顺序已经栈平衡并不是固定的(不同的函数调用约定)。

关于 寄存器 与内存的区别:  

寄存器位于cpu内部,执行速度快,但比较贵。

内存速度相对较慢,成本低,所以容量能做很大。

寄存器和内存没有本质区别,都是用于存储数据的容器,都是定宽的。

寄存器常用的8个通用寄存器 :EAX,ECX,EDX,EBX,   ESP, EBP, ESI, EDI.

计算机中的几个常用计量单位:BYTE, WORD, DWORD :BYTE(字节) = 8bit ; WORD (字 ) = 16bit ; DWORD (双字)=32bit; 

内存的数量特别庞大,无法每个内存单元都命名一个名字,所以用编号来替代。

我们称计算机CPU是32bit或者64bit,有很多书上说之所以叫32bit计算机是因为寄存器的宽度是32bit,这是不准确的,因为还有很多寄存器是大于32bit的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/380b5ec3faddd7d05fb7f819bf98ca95.html