寄存器

基本寄存器(8086)

1:数据寄存器,一般称之为通用寄存器组

8086 有8个8位数据寄存器
这些8位寄存器可分别组成16位寄存器:
AH&AL=AX:累加寄存器,常用于运算;
BH&BL=BX:基址寄存器,常用于地址索引;
CH&CL=CX:计数寄存器,常用于计数;
DH&DL=DX:数据寄存器,常用于数据传递。

2:地址寄存器/段地址寄存器

为了运用所有的内存空间,8086设定了四个段寄存器,专门用来保存段地址:
CS(Code Segment):代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器

3:特殊功能的寄存器

IP(Instruction Pointer):指令指针寄存器,与CS配合使用,可跟踪程序的执行过程
SP(Stack Pointer):堆栈指针,与SS配合使用,可指向目前的堆栈位置
BP(Base Pointer):基址指针寄存器,可用作SS的一个相对基址位置
SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针
DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针。

关于栈

ESP: 栈指针寄存器(extended stack pointer) - 指向系统栈最上面一个栈帧的顶部(也是整个栈的顶部)
EBP: 基址指针寄存器(extended base pointer) - 指向系统栈最上面一个栈帧的底部
ESP与EBP之间的内存空间为当前栈帧。

EIP: 指令寄存器(extended instruction pointer) - 存放一个指针,指向等待执行的指令地址。

不常用指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
CLD         ;clear flag DF
pushf ;将标志寄存器的值压栈
popf ;从栈中弹出数据,送入标志寄存器中。

pushad ;将所有寄存器压栈,执行后ESP=ESP-32(32位下)
;压栈顺序为EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI
popad ;对应pushad

lodsb ;将esi指向的地址处的数据取出来赋给AL寄存器
;然后esi=esi+1
lodsw ;与lodsb类似,操作的是字,赋值给AX
lodsd ;同上,赋值给EAX
stosb ;将AL寄存器的值取出来赋给edi所指向的地址处。
;即mov [edi],AL与edi=edi+1
stosw ;
stosd ;
;这一组指令操控的是esi与edi

cdq ;Convert Double to Quad
;将双字数据扩展到四字
;将EAX的最高位拷贝到EDX的每一位
;如果EAX<0x8000_0000,EDX=0xFFFF_FFFF
;否则EDX=0x0000_0000
;如EAX存储-5即EAX=0xFFFF_FFFB
;则EDX=0xFFFF_FFFF
;两个寄存器合在一起就可以表示一个64位数

movsx ;先符号扩展再传送
;对于正数而言,符号扩展等于零扩展
;对于负数而言,将一个内存较小的值扩展到较大的内存里
;需要保留符号位,所以高位全部赋1
movzx ;先零扩展再传送
;低位直接拷贝,高位部分赋0

Enter ;相当于push ebp和mov ebp,esp 常用于函数开始处
Leave ;相当于mov esp,ebp和pop ebp 常用于函数结束处

跳转相关指令

1.无条件跳转

1
jmp         ;无条件跳转

2.根据CX、ECX寄存器的值进行跳转

1
2
JCXZ        ;CX 为 0 则跳转
JECXZ ;ECX 为 0 则跳转

3.根据标志位进行跳转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
JE          ;等于则跳转
JNE ;不等于则跳转

JZ ;为 0 则跳转
JNZ ;不为 0 则跳转

JS ;为负则跳转
JNS ;不为负则跳转

JC ;进位则跳转
JNC ;不进位则跳转

JO ;溢出则跳转
JNO ;不溢出则跳转

JA ;无符号大于则跳转
JNA ;无符号不大于则跳转
JAE ;无符号大于等于则跳转
JNAE ;无符号不大于等于则跳转

JG ;有符号大于则跳转
JNG ;有符号不大于则跳转
JGE ;有符号大于等于则跳转
JNGE ;有符号不大于等于则跳转

JB ;无符号小于则跳转
JNB ;无符号不小于则跳转
JBE ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳转

JL ;有符号小于则跳转
JNL ;有符号不小于则跳转
JLE ;有符号小于等于则跳转
JNLE ;有符号不小于等于则跳转

JP ;奇偶位置位则跳转
JNP ;奇偶位清除则跳转
JPE ;奇偶位相等则跳转
JPO ;奇偶位不等则跳转

概念

文件偏移地址 = 虚拟内存地址(VA)-装载基址(Image Base)-节偏移