8086汇编指令解析
- 格式:doc
- 大小:77.50 KB
- 文档页数:16
8086汇编指令
·8086/8088 寄存器组
一、通用寄存器
二、段寄存器
三、指令指针
四、标志寄存器
·8086/8088 寻址方式
0.固定寻址
一、立即数寻址
1.立即寻址
二、寄存器操作数寻址
2.寄存器寻址
三、存储器操作数寻址
3.直接寻址
4.寄存器间接寻址
5.寄存器相对寻址
6.基址变址寻址
7.相对基址变址寻址
四、I/O端口寻址
·8086/8088 指令系统
一、数据传送
二、算术运算
三、逻辑运算
四、串操作
五、控制传送
六、处理器控制
符号说明
━━━━┯━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━
含义 │ 符号 │ 备 注
────┼────┼─────────────────────────
操作数 │OPRD │包括存储器、寄存器、立即数,可接8,16,32指明位数
存储器 │Mem │可接8,16,32表明操作数位数,如Mem32表示字操作数
累加器 │AReg │可接8, 16表明累加器的位数,AReg8即AL、AReg16即AX
寄存器 │Reg │可接8,16,32表明寄存器位数,如Reg16表示16位寄存器
段寄存器│Seg │代码段CS,数据段DS,堆栈段SS,附加段ES
标志位 │Flags │O D I T|S Z A P C
立即数 │Im │
有效地址│EA │Effective Address,即偏移量,其值不超过FFFFH
物理地址│PA │Physical Address
传送至 │<--, -->│
交换 │<---> │
可选 │{ } │
取内容 │( ) │(Reg)表示寄存器Reg的内容 取地址 │[ ] │[Mem]表示存储单元Mem的有效地址
━━━━┷━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━
·8086/8088 寄存器组
8086/8088包括四个16位数据寄存器,两个16位指针寄存器,两个16位变址
寄存器,一个16位指令指针,四个16位段寄存器,一个16位标志寄存器。
这14个16位寄存器分成四组,它们的名称和分组情况如下:
┌─┬─┐
│AH│AL│AX \ ┐
│BH│BL│BX \ 数据 │
│CH│CL│CX / 寄存器 │
│DH│DL│DX / │
└─┴─┘ ├ 通用寄存器
┌───┐ │
│ BP │基址指针 \ 指针 │
│ SP │堆栈指针 / 寄存器 │
│ SI │源地址 \ 变址 │
│ DI │目的地址 / 寄存器 ┘
└───┘
┌───┐
│ IP │指令指针 \ 控制
│ FLAG │标志寄存器/ 寄存器
└───┘
┌───┐
│ CS │代码段 \
│ DS │数据段 \ 段
│ SS │堆栈段 / 寄存器
│ ES │附加段 /
└───┘
一、通用寄存器(General Register)
通用寄存器的专门用途
━━━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
寄存器 │ 用 途
─────┼─────────────────────────────
AX │字乘法,字除法,字I/O
AH │字节乘法,字节除法
AL │字节乘法,字节除法,字节I/O,十进制算术运算
BX │存储器指针
CX │串操作或循环控制中的计数器
CL │移位计数器
DX │字乘法,字除法,间接I/O
BP │存储器指针(存取堆栈的指针) SP │堆栈指针
SI │存储器指针(串操作中的源指针)
DI │存储器指针(串操作中的目的指针)
━━━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1.数据寄存器
数据寄存器主要用于保存操作数或运算结果等信息,它们的存在节省了为存
取操作数所需占用总线和访问存储器的时间。
四个16位的数据寄存器可分解成八个独立的8位寄存器,这八个8位的寄存器
有各自的名称,均可独立存取。
━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AX, AL│累加器(Accumulator) 通过它进行操作所花时间可能最少
BX │基(Base)地址寄存器 唯一可作为存储器指针的数据寄存器
CX │计数(Count)寄存器 用来控重复制循环次数或移位位数
DX │数据(Data)寄存器 存放被除数高16位或余数,还有I/O地址
━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2.指针和变址寄存器
指针和变址寄存器主要用于存放某个存储单元地址的偏移,或某组存储单元
开始地址的偏移,即作为存储器(短)指针使用。作为通用寄存器,它们也可以
保存16位算术逻辑运算中的操作数和运算结果,有时运算结果就是所需要的存储
单元地址的偏移。
利用指针和变址寄存器不仅能够有效地缩短机器指令的长度,而且能够实现
多种存储器操作数的寻址,从而方便地实现对多种类型数据的操作。
━━━┯━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BP和SP│BP基指针(Base Pointer),SP堆栈指针(Stack Pointer)
│BP主要用于给出堆栈中数据区基址的偏移,便于直接存取堆栈数据
│SP只保存堆栈栈顶地址的偏移
───┼───────────────────────────────
SI和DI│SI源变址(Source Index),DI目的变址(Destination Index)
│在字符串操作中,规定由SI给出源指针,DI给出目的指针
━━━┷━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
二、段寄存器(Segment Register)
8086/8088 CPU 依赖其内部的四个段寄存器实现寻址1M字节物理地址空间。
8086/8088把1M字节地址空间分成若干逻辑段,当前使用段的段值存放在段寄存器
中,由段值和段内偏移形成20位地址:物理地址=段值×16+偏移。
8086/8088 CPU 的四个段寄存器均是16位的,分别称为:
┌ 代码段(Code Segment) 寄存器CS
│ 数据段(Data Segment) 寄存器DS
│ 堆栈段(Stack Segment)寄存器SS
└ 附加段(Extra Segment)寄存器ES
三、指令指针(Instruction Pointer) 8086/8088 CPU 中的指令指针IP(Instruction Pointer)也是16位的,它类似
于8080/8085中的程序计数器PC(Program Counter)。指令指针IP给出接着要执行
指针在代码段中的偏移。
四、标志寄存器(Flag Register)
8086/8088 CPU 中有一个16位的标志寄存器,包含了9个标志,主要用于反映
处理器的状态和运算结果的某些特征。各标志在标志寄存器中的位置如下:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
┌─┬─┬─┬─┬─┬─┬─┬─┳─┬─┬─┬─┬─┬─┬─┬─┐
│ │ │ │ │OF│DF│IF│TF┃SF│ZF│ │AF│ │PF│ │CF│
└─┴─┴─┴─┴┬┴┬┴┬┴┬┻┬┴┬┴─┴┬┴─┴┬┴─┴┬┘
│ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ 进位标志
│ │ │ │ │ │ │ └─ 奇偶标志
│ │ │ │ │ │ └─ 辅助进位标志
│ │ │ │ │ └─ 零标志
│ │ │ │ └─ 符号标志
│ │ │ └─ 追踪标志
│ │ └─ 中断标志
│ └─ 方向标志
└─ 溢出标志
有些指令的执行会影响部分标志,而有些指令的执行不会影响标志;反之,
有些指令的执行受某些标志的影响,而有些指令的执行不受标志的影响。
1.运算结果标志
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
(1) 进位标志CF(Carry Flag)
主要用于反映运算是否产生进位或借位。如果运算结果的最高位产生一个
进位或借位,则CF=1,否则CF=0。
移位指令也把操作数的最高位或最低位移入CF。
───────────────────────────────────
(2) 零标志ZF(Zero Flag)
用于反映运算结果是否为0。如果运算结果为0,则ZF=1,否则ZF=0。
───────────────────────────────────
(3) 符号标志SF(Sign Flag)
用于反映运算结果的符号位。SF与运算结果的最高位相同。
───────────────────────────────────
(4) 溢出标志OF(Overflow Flag)
用于反映有符号数加减运算是否引起溢出。如果运算结果超出了8位或16位
有符号数的表示范围(字节运算时大于127或小于-128,字运算时大于32767或
小于-32768),则OF=1,否则OF=0。
───────────────────────────────────
(5) 奇偶标志PF(Parity Flag)
用于反映运算结果中“1”的个数。如果“1”的个数为偶数,则PF=1,否则
PF=0。