1.8086CPU的16个寄存器:
8086CPU所有寄存器都16位:
通用寄存器: 存放一般性数据: 包括 数据寄存器 , 指针寄存器, 索引寄存器
(AX,BX,CX,DX,BP,SP,SI,DI)
数据寄存器: AX,BX,CX,DX
AX: AX(Accumulator Register) :累加寄存器,主要用于输入/输出和大规模的指令运算。常用于四则运算,函数返回值等
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
16位寄存器存储数据最大值为2^16-1 65536-1 = 65535
AX = AH + AL
AH:为高8位
8位寄存器的最大存储数据量为 2^8-1 = 256-1 = 255
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 |
AL:为低8位
7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
AX与AH及AL的关系:
进制转换:
2000 ==> 0100 1110 0010 0000 =====>十进制转换二进制
===>4 E 2 0 =====>二进制转换十六进制
AH:高8位存 4E , AL:低8位存 20
BX: BX(Base Register):基址寄存器,常用于在相对寻址(基址+偏移)中存储基址(基础访问地址)。也常用于四则运算。
BX=BH+BL
CX: CX(Count Register):计数寄存器,CX 寄存器在迭代的操作中会循环计数
CX=CH+CL
DX: DX(Data Register):数据寄存器,也用于输入/输出操作。还与AX寄存器一起使用,用于涉及大数值的乘法和除法运算
DX=DH+DL
索引(变址)寄存器: SI,DI
SI: SI(Source Index):源索引寄存器。变址寄存器。常用于在变址寻址(基址+变址)中存储变址,也常用来拷贝源字符串。
DI: DI(Destination Index):目的索引寄存器。目标变址寄存器。常用于在变址寻址(基址+变址)中存储变址。也常用来复制到目标字符串
- x32构架下指针寄存器名称为ESI,EDI。低位地址分别对应SI和DI。
- x64构架下指针寄存器名称为RSI,RDI。低位地址分别对应ESI和EDI。
指针寄存器: SP,BP
SP: SP(Stack Pointer):栈指针,栈顶指针,只能访问栈顶
BP: BP(Base Pointer):基础指针,栈寄存器上的偏移量,用来定位栈上变量。用它可直接存取堆栈中的数
指针寄存器不可分割成8位寄存器。作为通用寄存器,也可存储算术逻辑运算的操作数和运算结果。
- x32构架下指针寄存器名称为ESP,EBP。是32位通用寄存器。低位可以用SP,BP访问。
- x64构架下指针寄存器名称为RSP,RBP。是64位通用寄存器。低位可以用ESP,EBP访问
SI和DI功能和BX相同,可以用于间接寻址。主要用于存放存储单元在段内的偏移量。但是SI、DI不可分割成8位寄存器
控制寄存器:IP, FLAG
IP: 指令指针寄存器
32位寄存器EIP低16位相当于IP
31 | 30 | 29 | . | . | . | . | . | . | 2 | 1 | 0 |
P(Instruction Pointer):指令指针。是存放下次将要执行的指令在代码段的偏移量。即CS:IP执行下一条要执行的命令。
32位CPU把指令指针扩展到32位,并记作EIP。EIP的低16位与IP作用相同。
64位CPU把指令指针扩展到64位,并记作RIP。RIP的低16位与EIP作用相同
FLAG: 标志寄存器
段寄存器: CS,SS,DS,ES
16为构架中,16位的指针只能访问64k的内存,为了访问更多的内存,使用段寄存器和指针配合访问内存地址。(x32,x64都采用段寄存器+指针地址方式访问内存
CS: CS(Code Segment):代码段寄存器。CS:IP
表示要执行代码的内存地址
SS: SS(Stack Segment):栈段寄存器。SS:SP
是栈顶内存地址。
DS: DS(Data Segment):数据段寄存器。DS:偏移量
是数据的内存地址。
ES: ES(Extra Segment):扩展段寄存器。扩展的数据段寄存器。
计算机启动后会自动找到地址CS:IP
地址的指令代码运行,运行后IP自动偏移下一个指令。
数据地址默认段寄存器为DS。栈默认段寄存器为SS。
x32和x64构架段寄存器名称未变,但是扩展了两个寄存器。
- FS(Extra Segment):数据段寄存器。扩展的数据段寄存器。
- GS(Extra Segment):数据段寄存器。扩展的数据段寄存
PSW:
2.x32构架
x32架构中,通用寄存器都在16位版本的基础上扩展成为32位版本,名字加了E作为前缀。
- EAX(低位为AX):通用寄存器
- EBX(低位为BX):通用寄存器
- ECX(低位为CX):通用寄存器
- EDX(低位为DX):通用寄存器
为了兼容16位模式程序,访问AX,BX,CX,DX相当于访问32位寄存器的低16位,32位寄存器的高16位不可单独访问
3.x64构架
在x64架构中,通用寄存器都扩展成为64位版本,名字也进行了升级。
- RAX, RBX, RCX, RDX
- R8-R15:x64架构引入的8个新的通用寄存器
为了兼容32位模式程序,使用上面的名字仍然是可以访问的,相当于访问64位寄存器的低32位。高位32位模式不可访问
4.寄存器寻址:
1.指令寻址:
CPU执行的指令只有一种寻址方式,即16位上地址为 CS:IP
x32上地址为 CS:EIP
x64上地址为 CS:RIP
2.数据寻址:
也就是指令的操作数有七种寻址方式:
- 立即寻址:立即数 (如:mov ax,80h) ,这个80h叫立即数,直接加载到内存中
- 寄存器寻址:寄存器中的数 (如: mov ax,bx) 这个直接传入bx寄存器名
- 内存寻址(根据段地址和给定地址找到数据)
- 直接寻址:直接指定地址 (如:mov ax,[123H] 直接访问默认段寄存器DS,也可ES:[123H]来访问扩展段寄存器)
- 间接寻址:寄存器中指定地址 (如:mov ax,[di] 直接传入变址寄存器)
- 相对寻址:寄存器中地址+偏移量(如: mov bx,[si+100h],传入si变址寄存器与100h偏移量)
- 变址寻址:寄存器中地址+变址寄存器中地址(如: mov bx,[bx+si] 传入基址与变址)
- 相对变址寻址:寄存器中地址+变址寄存器中地址+偏移量(如: mov ax,[bx+si+100h] 传入基址+变址及偏移量)
- 基址寄存器为BX,缺省的段寄存器为DS。
- 基址寄存器为BP,缺省的段寄存器为SS。
5.汇编指令简单操作:
mov AX,18 ;18存入AX寄存器 AX=18 16位寄存器
mov AH,78 ;78存入AH寄存器 AH=78 8位寄存器
add AX,8 ;AX寄存器中的值加上8 AX=AX+8
mov AX,BX ;BX寄存器的值存入AX寄存器 AX=BX
add AX,BX ;AX寄存器中的值加上BX寄存器中的值,保存在AX寄存中 AX=AX+BX