寄存器
80386共提供7种类型的32位寄存器,如下:
1、通用寄存器(EAX、EBX、ECX、EDX、ESP、EBP、ESI、EDI)
2、段寄存器(CS、SS、DS、ES、FS、GS)
3、指令指针寄存器和标志寄存器(EIP、EFLAGS)
4、系统表寄存器(GDTR、IDTR、LDTR、TR)
5、控制寄存器(CR0、CR1、CR2、CR3、CR4)
6、调试寄存器(DR0、DR1、DR2、DR3、DR4、DR5、DR6、DR7)
7、测试寄存器(TR6、TR7)
通用寄存器
EAX:累加器
EBX:基址寄存器
ECX: 计数(每次loop减一)
EDX:乘除时候存高位
ESI:源变址寄存器
EDI:目的变址寄存器
[ebx+esi+100h]基址变址寻址
段寄存器
段寄存器中不存放某个段的基地址,而是某个段的选择符。因为16位寄存器无法存放32位段基地址,只好存放在段的描述符中。
ES、FS、GS附加数据段寄存器
EIP:指令指针寄存器
EIP存放下一条指令的偏移量(相对于目前代码段CS而言的)
EFLAGS: 标志寄存器
系统地址寄存器(保护模式的寻址):
GDTR
IDTR
LDTR
TR
EIP寻址
GDT(全局描述符号表)只有一个
LDT(局部描述符号表)会有很多
GDT包含了所有指向LDT的描述符
TI=0时的寻址
先访问GDTR,得到GDT的基址和限长,找到并访问GDT。根据Index中的描述符序号,来找到GDT中对应的描述符,加上EIP中的地址,即为内存的线性地址。
TI=1时的寻址
同样先访问GDTR,得到GDT的基址和限长,由于在GDT中指向所有LDTs的描述符地址紧跟在GDT正常全局寻址的描述符之后,通过基址和限长计算即得到了指向第一个LDT描述符的地址。然后访问LDTR得到描述符序号,找到对应的LDT描述符,进而找到LDT。根据Index中的描述符序号,来找到LDT中对应的描述符,加上EIP中的地址,即为内存的线性地址。
数据传送指令
通用数据传送指令
格式:MOV DEST,SRC
扩展传送指令
格式:MOV SX DEST,SRC
MOV ZX DEST,SRC
功能:将源操作数由8位扩展到16位目的操作数,或由16位扩展到32位目的操作数。MOVSX 先符号扩展,再传送,即正数高位全扩展0,负数高位全扩展1。
MOVZX 先零扩展,再传送,即高位全扩展0。
交换指令
XCHG OPR1 OPR2
互换通用寄存器或存储器OPR1 OPR2
BSWAP REG
将32位通用寄存器中第1个字节与第4个字节互换,第2与第3互换
MOV RAX 44332211H
BSWAP EAX (11223344H)
堆栈操作指令
PUSH
PUSHA
将所有16位通用寄存器压栈,顺序为AX,CX,DX,BX,SP,BP,SI,DI
PUSHAD
32位通用寄存器压栈,顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
POP
POP AX
POP ECX
POPA
POPAD
一样的
地址传送指令
LEA REG,MEM
将源操作数的有效地址传到通用寄存器
LEA EAX,[EBX]
将EBX内容的有效地址传到EAX中
相当于 MOV EAX,EBX
逻辑运算指令
逻辑指令
移位指令
AND DST, SRC
OR DST, SRC
XOR DST, SRC
NOT DST
TEST DEST, SRC:
先进行与操作,结果不回送目的操作数,只改变标志寄存器。
通常用于测试操作数中某位是否为1(通过判ZF是否为0),而且不会影响操作数。
移位指令可以由立即数直接给出,亦可以由CL间接给出,分为一般移位指令和循环移位指令
一般移位指令
算术/逻辑左移指令
SAL DST, OPRD
SHL DST, OPRD
最高位移入CF,每移动一位,右边补一个0,SAL,SHL指令影响标志位OF,SF,ZF,PF,CF
SAR DST, OPRD
SHR DST, OPRD
控制转移类指令
串指令操作
MOVS
MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]
将ESI中地址所指数据移到EDI中地址所指位置
REP MOVS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI]
1、将ESI中地址所指数据移到EDI中地址所指位置
2、ESI,EDI中数据分别加4
3、ECX中数据减1
4、跳到1,如果ECX=0,结束