汇编语言 寄存器总结 (转载)

转自CSDN博客,Dask Jhonson

转自CSDN博客,iteye_10501

表格总结:

寄存器的分类 寄存器 主要用途
通用寄存器 数据寄存器 AX 乘、除运算,字的输入输出,中间结果的缓存
AL 字节的乘、除运算,字节的输入输出,十进制算数运算
AH 字节的乘、除运算,存放中断的功能号
BX 存储器指针
CX 串操作、循环控制的计数器
CL 移位操作的计数器
DX 字的乘、除运算,间接的输入输出
变址寄存器 SI 存储器指针、串指令中的源操作数指针
DI 存储器指针、串指令中的目的操作数指针
BP 存储器指针、存取堆栈的指针
SP 堆栈的栈顶指针
指令指针 IP/EIP
标志位寄存器 FLag/EFlag
32位CPU的段寄存器 16位CPU的段寄存器 ES 附加段寄存器
CS 代码段寄存器
SS 堆栈段寄存器
DS 数据段寄存器
新增加的段寄存器 FS 附加段寄存器
GS 附加段寄存器

8086CPU总共有14个寄存器:

即AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES共14个。

1. 通用寄存器

AX,BX,CX,DX称作为数据寄存器

AX (Accumulator):累加寄存器,也称之为累加器;

BX (Base):基地址寄存器;

CX (Count):计数器寄存器;

DX (Data):数据寄存器;

SP和BP又称作为指针寄存器

SP (Stack Pointer):堆栈指针寄存器;

BP (Base Pointer):基指针寄存器;

SI和DI又称作为变址寄存器

SI (Source Index):源变址寄存器;

DI (Destination Index):目的贬值寄存器;

2. 控制寄存器

IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器;

3. 段寄存器

CS (Code Segment):代码段寄存器;

DS (Data Segment):数据段寄存器;

SS (Stack Segment):堆栈段寄存器;

ES (Extra Segment):附加段寄存器;

以上是常见的寄存器分类;其终值得注意的每个寄存器都是16位的(dword,双字节),而只有4个数据寄存器,即AX,BX,CX,DX可以拆分为两个8位寄存器来使用

寄存器使用方法

1. 4个数据寄存器是可拆分的

例如AX可分为AH(高位寄存器)和AL(低位寄存器),即:在负值的时候可分开赋值。

2. CS/IP寄存器

CS:IP 索引的内存即为CPU开始读取代码的起点,之后的一段代码区域,被称为代码片段(code segment),这两个寄存器不能进行赋值操作(mov操作),只能通过jmp指令跳转。

jmp 4E6A:0

3. SS/SP

用于栈顶操作

4. segment(段)

  1. 数据段(被存在DS指定的段地址开始的地方)
  2. 代码段(被存在CS指定的段地址开始的地方)
  3. 栈段(被存在SS指定的段地址开始的地方)

一般通过assume伪指令把数据段绑定在对应的段上,

assume cs:code, ds:data, ss:stack

5. 寄存器寻址

(1) 在8086CPU中只有这四个寄存器可以在[…]中进行内存单元的寻址。

比如,下面的指令都是正确的:

mov ax,[bx]

mov ax,[bx+si]

mov ax,[bx+di]

mov ax,[bp]

mov ax,[bp+si]

mov ax,[bp+di]

而下面都是错误的:
mov ax,[cx]

mov ax,[ax]

mov ax,[dx]

mov ax,[ds]

(2) 在[…]中,这四个寄存器可以单独出现,或者只能以四种组合出现:bx和si、bx和di、bp和si、bp和di。

比如下面都是正确的:

mov ax,[bx]

mov ax,[si]

mov ax,[di]

mov ax,[bp]

mov ax,[bx+si]

mov ax,[bx+di]

mov ax,[bp+si]

mpv ax,[bp+di]

mov ax,[bx+si+idata]

mov ax,[bx+si+idata]

mov ax,[bp+si+idata]

mov ax,[bp+di+idata]

下面就是错误的:

mov ax,[bx+bp]

mov ax,[si+di]

(3) 只要在[…]中使用寄存器bp,而指令汇总没有显示给出段地址,段地址就默认在ss中。 比如下面的指令:

mov ax,[bp] 含义:(ax)=((ss)*16+(bp))

mov ax,[bp+idata] 含义:(ax)=((ss)*16+(bp)+idata)

mov ax,[bp+si] 含义:(ax)=((ss)*16+(bp)+(si))

mov ax,[bp+si+idata] 含义:(ax)=((ss)*16+(bp)+(si)+idata)