汇编与高级语言
1. 汇编基础知识
1.1. 寄存器
寄存器 |
用途 |
EAX,EBX,EDX,ECX |
通用寄存器,由程序员自己指定用途,也有一些不成文的用法: EAX:常用于运算。 EBX:常用于地址索引。 ECX:常用于计数。 EDX:常用于数据传递。 |
EIP |
指令寄存器,指出当前指令所在的地址。 |
ESP |
栈指针,指向当前线程的栈顶。 |
EBP |
栈基址指针,对调试起着很重要的作用。 |
EDI,ESI |
没有规定作什么用,一般用在源指针和目标指针的操作。 |
FR |
标志寄存器,由多个标志位组成,存放运算结果的标志,比如借位,进位,是否为0等等。 |
FS |
在Windows中,FS:[0]用来指向异常处理机制的链接头。 |
说明:
l ESP和EBP对高级语言的函数实现起着非常重要的作用。
l FS是SEH(Structured Exception Handling)中起重要作用的一个段寄存器,它的0偏移指向异常结构连表的表头,Windows在进行结构化异常处理时,就是从FS:[0]开始遍历异常结构并调用其中的异常处理函数的。
1.2. 堆栈
堆是一块内存区域,一般用于内存的动态分配和释放,比如用New方法分配一个指针,此时即在程序地址空间的堆中分配了一块内存。又比如Delphi的对象也是在堆中创建的。
栈是一种先进后出的列表数据结构,在高级语言的编程中使用广泛,在低级语言中更是不可或缺的基础概念。栈也是一个内存区域,不过它具有快速灵活的特点,CPU直接提供指令去访问栈。
从汇编的角度来看,栈具有如下的性质:
l 栈有两个基础动作,压栈(PUSH)