8088/8086指令系统

寻址方式

指令的组成

  • 操作码字段:标明计算机要执行什么操作

  • 操作数字段:指出指令在执行过程中所需要的操作数(值为多少或者放在什么地方),以及操作结果送到哪里

指令的一般格式:操作数字段可以有一个,二个或三个操作数,通常称为“一地址”,“二地址”或“三地址”指令。 8088-8086指令系统1

指令中如何提供操作数或操作数地址的方式称为寻址方式。(规定如何对地址字段作出解释以找到操作数)

在不同的计算机系统中,寻址方式的名称和分类并不统一,但基本可以归结为以下几种方式或它们的变型或组合:

  • 立即寻址(立即数寻址)

  • 寄存器寻址

  • 直接寻址

  • 间接寻址

  • 变址寻址

8088/8086与操作数有关的寻址方式

  • 立即寻址方式

  • 寄存器寻址方式

  • 直接寻址方式

  • 寄存器间接寻址方式

  • 寄存器相对寻址方式

  • 基址变址寻址方式

  • 基址变址相对寻址方式

寻址方式总结

  1. 三种类型的操作数:立即数(data),寄存器操作数(reg),存储器操作数(mem)。

  2. 段前缀:寻址方式隐含地规定了存储器操作数的段地址。允许数据存放在其它的段(代码段除外),此时应在指令中给出 “段前缀”。

  3. 寄存器间接寻址(MOV AX, [BX])和寄存器相对寻址 (MOV AX, 1100H[BX]) 8088-8086指令系统2

  4. 操作数的类型必须一致

指令系统

8088/8086的指令系统可分为六大类:

  • 数据传送指令

  • 算术运算指令

  • 逻辑运算和移位指令

  • 控制转移指令

  • 串操作指令

  • 处理器控制指令

数据传送指令

所有通用传送指令都不影响标志位。

  1. MOV指令

  • MOV mem/reg1,mem/reg2

  • MOV reg,data

  • MOV ac,mem

  • MOV segreg,mem/reg

  • MOV mem/reg,segreg

  • MOV mem/reg,data

  1. PUSH 和 POP 指令

  • PUSH reg

  • PUSH mem

  • POP reg

  • POP mem

  1. 交换指令

  • XCHG reg,reg

  • XCHG reg,mem

  • XCHG mem,reg

  1. 输入输出指令

  • 直接输入输出指令

    • IN AL,PORT; AL ← (PORT)

    • IN AX,PORT; AX ← (PORT+1,PORT)

    • OUT PORT,AL; (PORT) →AL

    • OUT PORT,AX; (PORT+1,PORT) → AX 注:PORT为输入输出端口号,范围为0~255(00~FFH)

  • 间接输入输出指令

    • IN AL, DX; AL ← (DX)

    • IN AX, DX; AX ← (DX+1,DX)

    • OUT DX,AL; (DX) → AL

    • OUT DX,AX; (DX+1,DX) → AX 在使用间接输入输出指令之前,需将端口号 → DX

  1. 地址传送指令

  • LEA (Load Effective Address)

  • LDS (Load pointer into register and DS)

  • LES (Load pointer into register and ES)

算术运算指令

  1. 二进制加法和减法指令

  • 加法   ADD DST,SRC   DST ←SRC+DST

  • 带进位加法 ADC DST,SRC   DST ←SRC+DST+CF

  • 减法   SUB DST, SRC   DST ←DST﹣SRC

  • 带借位减法 SBB DST,SRC   DST ←ST﹣SRC﹣CF 标志位: 所有状态标志都受到指令执行结果的影响。

  1. 加1 减1和比较指令

  • 加 1 INC OPR   OPR ← OPR+1 INC reg INC mem

  • 减 1 DEC OPR   OPR ← OPR-1 DEC reg DEC mem

  • 标志位: O D I T S Z A P C × - - - × × × × -

  1. 求补指令

  • NEG reg

  • NEG mem 操作: 对操作数按位取反, 末位加1。

  1. 比较指令

  • CMP OPR1, OPR2

  • 操作:OPR1-OPR2

  1. 乘法指令

  • 带符号乘法

    • 格式:IMUL SRC

    • 所执行的操作: 字节操作数: AX ← (AL)* (SRC) 字操作数: DX:AX ← (AX)*(SRC) (乘积带符号,并符合一般代数符号规则)

  • 无符号乘法

    • 格式:MUL SRC

    • 所执行的操作: 同IMUL,但操作数和乘积均不带符号。

  1. 除法指令

  • 带符号除法

    • 格式:IDIV SRC

    • 所执行的操作: SRC为字节数据: AL ← (AX)/(SRC) 之商 AH ← (AX)/(SRC) 之余数 SRC为字数据: AX ← (DX:AX)/(SRC) 之商 DX ← (DX:AX)/(SRC) 之余数 商和余数是带符号的:商的符号符合一般代数符号规则,余数的符号与被除数相同。

  • 无符号除法

    • 格式:DIV SRC

    • 所执行的操作: 与IDIV相同,但操作数,商和余数均是无符号的。

  • 符号扩展指令

    • CBW 操作:将AL中的8位带符号数扩展为16位并送入AX中。 实际上就是将AL的最高位送入AH的所有各位。

    • CWD 操作:将AX中的16位带符号数扩展为32位并送入DX和AX中(其中DX存放高16位,AX存放低16位)。 实际上就是将AX的最高位送入DX的所有各位。

逻辑运算和移位指令

  1. 逻辑运算指令

  • 非 NOT OPR   OPR ← OPR

  • 或 OR DST,DST   DST ← DST ∧ SRC

  • 与 AND DST,SRC   DST ← DST∧SRC

  • 异或 XOR DST,SRC   DST ← DST ∨ SRC

  • 测试 TEST OPR1,OPR2   OPR1∧OPR2 标志: O D I T S Z A P C 0 - - - × × U × 0 (NOT指令除外,对标志位无影响)

  1. 移位指令

  • 逻辑左移 SHL OPR,CNT

  • 算术左移 SAL OPR,CNT

  • 逻辑右移 SHR OPR,CNT

  • 算术右移 SAR OPR,CNT (OPR是除立即数以外的任何一种寻址方式,CNT可以是1或CL) 标志位: O D I T S Z A P C × - - - × × U × × (左移1位时,若最高位发生改变,则OF=1;否则OF =0。)

  • (不带进位)循环左移 ROL OPR, CNT

  • (不带进位)循环右移 ROR OPR, CNT

  • (带进位)循环左移 RCL OPR , CNT

  • (带进位)循环右移 RCR OPR , CNT

控制转移指令

  1. 与转移有关的寻址方式(无条件转移指令)

  • 段内直接转移

  • 段间直接转移

  • 段内间接转移

  • 段间间接转移 区别:对CS和IP进行修改的方法不同

  1. 条件转移指令

  • 寻址方式相同:段内直接短转移

  • 处理流程相同, 判断条件不同

  1. 循环控制指令

  • LOOP OPR

  • 功能: (CX) - 1→ CX 若 (CX) ≠0,则转移至标号OPR处;否则顺序执行

  1. 子程序调用与返回

  • CALL

  • RET

  1. 中断调用与返回

  • INT

  • IRET


《IBM-PC汇编语言程序设计(第2版)》沈美明 温冬婵 著

Last updated