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