汇编指令初步
机器指令是CPU能直接识别并执行的指令,它的表现形式是二进制编码,如00001001010101100110010000101011。用机器指令编写出来的程序执行效率高,没有多余的额外操作。但由于机器指令十分复杂,难以记忆,且不方便阅读和修改,容易产生错误,所以设计了汇编指令,通过一些能反映机器指令功能的单词或词组来代表该机器指令,而不再关心机器指令的具体二进制编码。与此同时,汇编指令也把CPU内部的各种资源符号化,使用该符号名也等于引用了该具体的物理资源。
寄存器
80386提供以下几种不同类型的32位寄存器
整数寄存器(前 6 个为通用寄存器)
- EAX:累加器(Accumulate),是算术运算的主要寄存器,也是存放函数返回值的寄存器
- EBX:基址寄存器(Base),在内存中寻址时存放基址
- ECX:计数器(Counter)
- EDX:数据寄存器(Data)
- ESI:源变址
- EDI:目标变址
- ESP:堆栈指针,栈顶
- EBP:基址指针,栈底
以上通用寄存器的低16位又构成一个16位寄存器,以兼容更短的指令,分别为:AX、BX、CX、DX、SI、DI、SP、BP。而AX、BX、CX、DX又可划分为两个8位的寄存器,分别为AH和AL,BH和BL,CH和CL,DH和DL,它们实际上是相应的16位寄存器的高8位和低8位。当指令改变寄存器中包含的小寄存器时,寄存器的其他字节不会改变,如改变AL的值时,仅会改变AL表示的一个字节,而不会改变另外3个字节。
段寄存器
- CS:代码段寄存器
- SS:堆栈段寄存器
- DS:数据段寄存器
- ES、FS、GS:附加数据段寄存器
指令指针寄存器和标志寄存器: EIP、EFLAGS,其中指令指针寄存器也叫程序计数器(PC)
系统表寄存器: GDTR、IDTR、LDTR、TR
控制寄存器: CR0、CR1、CR2、CR3、CR4
调试寄存器: DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7
测试寄存器: TR6、TR7
AT&T汇编代码概览
格式:指令 源操作数, 目的操作数
示例:movl $8, %eax
操作数可分为立即数(immediate)、寄存器(register)操作数和存储器(memory)操作数。
- 立即数不必存储于寄存器或存储器中,可以直接出现在指令中,不可作为目的操作数,相当于高级语言中的常量,使用立即数时,需要在立即数前加上$,如$0x1F。另外,还有一种符号常量,也可以直接引用,相当于高级语言中的变量,引用符号常量的地址时需要在符号常量前加上$。
- 寄存器操作数可作为源操作数或目的操作数,引用寄存器操作数时需要在寄存器名称前加上%,如%eax,CPU计算总是仅从寄存器直接存/取数据,也就是说,两个操作数中至少要有一个是寄存器操作数。R[Ea] 用来表示寄存器 Ea 中的内容。
- 存储器操作数也叫存储器引用,它根据