4.2.2 指令寻址方式
- 段内直接寻址
- 直接寻址:直接指明目标地址
- 段间寻址:只改变IP寄存器的值而不改变CS寄存器的值
指令名 SHORT 目标地址号
指令名 转移目标地址标号
指令名 NEAR PTR 转移目标地址标号
- 段间直接寻址
- 直接寻址:指令中直接指明目标地址
- 段间寻址:不仅改变IP寄存器的值而且改变CS寄存器的值,因此又叫段间寻址。
指令名 FAR PTR 转移地址标号
指令名 段地址:段偏移地址
- 段内间接寻址
- 间接寻址:转移的目标地址放在寄存器或存储器中
- 段内寻址:这种指令只改变IP寄存器的值而不改变CS寄存器的值
指令名 16位寄存器名
指令名 WORD PTR 存储器寻址方式
- 段间间接寻址
- 间接寻址:转移的目标地址放在存储器中
- 段间寻址:这种指令不仅改变IP寄存器的值而且改变CS寄存器的值
指令名 DWORD PTR 存储器寻址方式
4.3 8086指令系统
拥有133条基本指令,按功能分成六类:
(1)数据传送指令
(2)算术运算指令
(3)逻辑运算指令
(4)串操作指令
(5)控制转移指令
(6)处理器控制指令
4.3.1 数据传送指令
4.3.2 算术运算指令
- 加法与减法指令
(1)ADD DST, SRC
源操作数:通用寄存器、存储器、立即数
目的操作数:通用寄存器、存储器
执行的操作:DST←DST + SRC
(2) ADC DST, SRC
源操作数:通用寄存器、存储器、立即数
目的操作数:通用寄存器、存储器
执行的操作:DST←DST + SRC + C
(3) INC OPRD
操作数:通用寄存器、存储器 (不能是段寄存器或立即数)
执行的操作:OPRD←OPRD + 1
(4) 减法指令
SUB DST, SRC
源操作数:通用寄存器、存储器、立即数
目的操作数:通用寄存器、存储器
执行的操作:DST←DST – SRC
(5) SBB DST, SRC
源操作数:通用寄存器、存储器、立即数
目的操作数:通用寄存器、存储器
执行的操作:DST←DST - SRC –C
(6) DEC OPRD
操作数:通用寄存器、存储器 (不能是段寄存器或立即数)
执行的操作:OPRD←OPRD - 1
功能: 用于在循环中修改地址指针及循环次数等。
(7) NEG OPRD
操作数:通用寄存器、存储器
执行的操作:求补指令,将操作数按位取反后加1,再送回操作数。
(8) CMP DST, SRC
源操作数:通用寄存器、存储器、立即数
目的操作数:通用寄存器、存储器
执行的操作: DST – SRC - 乘法指令与除法指令
(1) MUL SRC —— 无符号数乘法
源操作数:通用寄存器、存储器(不能是立即数)
目的操作数:DX, AX (隐含)
执行的操作:字节操作 (AH,AL)←(AL)(SRC)
字操作 (DX,AX)←(A X )(SRC)
IMUL SRC —— 带符号数乘法
源操作数:通用寄存器、存储器(不能是立即数)
目的操作数:DX, AX (隐含)
执行的操作:字节操作 (AH,AL)←(AL)(SRC)
字操作 (DX,AX)←(AX)(SRC)
(2) 除法指令
无符号数除法指令: DIV SRC
带符号数除法指令: IDIV SRC
执行操作: 字节操作 (AL) ←(AX) / (SRC)的商
(AH) ←(AX) / (SRC)的余数
字操作 (AX) ←(DX,AX) / (SRC)的商
(DX) ←(DX,AX) / (SRC)的余数 - 符号扩展指令
字节扩展成字指令 CBW
格式:CBW ;
功能:将 AL 中的符号位扩展到 AH 中, AX 为一个带符号的16为数。
字扩展成双字指令CWD
格式:CWD ;
功能:将 AX 中的有符号数的符号位扩展到 DX 中, DX,AX 中的数成为一个带符号双字。 - 十进制算术运算指令(BCD 码调整指令)
压缩BCD码调整指令
① 压缩BCD 码加法调整指令(不影响OF的状态)
② 压缩 BCD 码减法调整指令(不影响OF的状态)
非压缩BCD码调整指令
① 非压缩BCD码加法调整指令(只影响AF和CF的状态)
②非压缩BCD码减法调整指令(只影响AF 和 CF )
③非压缩BCD 码乘法调整指令(影响 SF,ZF,PF)
④非压缩 BCD 码除法调整指令(影响 SF,ZF,PF)
4.3.3 逻辑运算指令:
① 逻辑非: NOT dst ; dst-> dst
② 逻辑与: AND dst,src; dst∧src-> dst
③ 逻辑或: OR dst,src; dst∨src ->dst
④ 逻辑异或: XOR dst,src; dst⊕src-> dst
⑤ 测试指令:TEST dst,src; dst∧src 只影响标志
4.3.4 移位指令
- 非循环移位指令:
(1)算术左移: SAL dst, CNT;
(2)逻辑左移: SHL dst, CNT;
(3)算术右移: SAR dst, CNT;
(4)逻辑右移: SHR dst, CNT; - 循环移位指令:
(1)循环左移: ROL dst, CNT;
(2)循环右移: ROR dst, CNT;
(3)带CF循环左移:RCL dst, CNT;
(4)带CF循环右移:RCR dst, CNT;
4.3.5 串操作指令:
1.基本串操作指令 (1) 串传送指令: 不影响FR src:MEM; dst:MEM
① 字节串传送指令:
格式: MOVSB ; DS×16+SI] B->ES×16+DI]
自动修改指针 : SI±1 ->SI DI±1->DI
② 字串传送指令:
格式: MOVSW ; [DS×16+SI]- W> [ES×16+DI]
自动修改指针 : SI±2 ->SI DI±2-> DI
(2) 串比较指令: 影响FR
① 字节串比较指令:
格式: CMPSB ; [DS×16+SI]-[ES×16+DI]
自动修改指针 : SI±1-> SI DI±1-> DI
② 字串比较指令:
格式: CMPSW ; [DS×16+SI]-[ES×16+DI]
自动修改指针 : SI±2 ->SI DI±2-> DI
(3) 串扫描指令: 影响 FR src:AL/AX ; dst:MEM
① 字节串扫描:
格式: SCASB ; AL-[ES×16+DI]且 DI ± 1 ->DI
② 字串扫描:
格式: SCASW; AX-[ES×16+DI]且 DI ±2 ->DI
(4) 串装入指令: 不影响 FR src:MEM ; dst:AL/AX
① 字节装入
格式: LODSB ; [DS×16+SI]-> AL 且 SI±1-> SI
② 字串装入:
格式: LODSW; [DS×16+SI]->AX 且 DI±2 ->DI
(5) 串贮存指令: 不影响 FR src:AL/AX ; dst:MEM
① 字节存储:
格式: STOSB; AL->[ES×16+DI]且 DI ± 1-> DI
② 字串存储:
格式: STOSW; AX->[ES×16+DI]且 DI ±2-> DI
- 串操作重复前缀指令
(1) 无条件重复前缀: 用在MOVS,STOS,LODS指令前
格式:REP
功能:对跟在REP后面的串操作指令重复执行
CX ≠ 0 时,重复执行串操作。每执行一次串操作,CX-1-> CX, 当 CX=0时,停止执行串操作,转向执行下一条指令; 用于存储器中数据块的搬家。
(2) 相等重复前缀: 用在CMPS,SCAS指令前
格式:REPE
功能:对跟在REPE后面的串操作指令重复执行
条件为:CX ≠ 0 且 ZF =1。
每执行一次串的比较或扫描的操作,CX-1-> CX,当满足上述条件, 重复执行串操作 。当 ZF = 0 或 CX = 0 时,停止串操作的执行 。
③不相等重复前缀:
用在CMPS,SCAS指令前
格式:REPNE (或REPNZ)
功能:对跟在REPNZ后的串操作指令重复执行
条件为:CX ≠ 0 且 ZF = 0。
每执行一次串的比较或扫描的操作,CX-1-> CX,当满足上述条件, 重复执行串操作。直至 CX = 0 或 ZF =1 时,停止串操作的执行。
用于比较两个串中的元素都不相等或在串中扫描某个元素。
(5)控制转移指令:
(1) 无条件转移指令JMP
① 段内直接短转移:(相对转移)
格式:JMP short target; short: 属性操作符,“短”
功能:把当前的IP 值与 target代表的8位偏移量之和送入(IP), 即:(IP+target) ->IP; CPU从 IP新指出的地址开始取指令并执行,程序的运行发生转移。
② 段内直接近转移:(相对转移)
格式:JMP NEAR PTR target;
功能:(IP+target) IP;使程序的运行发生转移,以本指令为中心在: -32768 ~ +32767字节范围内转移,可转到段内任一地址。
③ 段内间接转移
格式:JMP REG / MEM ; 通过REG/MEM间接给出转移的目标地址。
功能:(REG / MEM)->IP;即将寄存器中的值或存贮器中的一个字送到 IP中, 使程序的运行发生转移。
④ 段间直接转移:
格式:JMP FAR PTR target ; target:符号地址或32位的立即数构成
功能:将符号地址的前面一个字送 IP,后一个字送 CS;这样同时 修改了CS和 IP中的值,程序的执行跳转到另一代码段开始执行。
⑤ 段间间接转移
格式:JMP DWORD PTR[MEM]; [MEM]:操作数的寻址方式
功能:由指令中的存储器操作数寻址方式提供 MEM 的有效地址EA,此EA指定的双字中, 第一个字送 IP,第二个字送 CS,从而得到转移的目标地址; CPU从另一代码段取指并开始执行。
(2) 条件转移指令
I. 单个标志位的条件转移指令:
① 测试ZF: JZ / JE target ; ZF= 1 结果为零(两数比较相等),则转移 JNZ / JNE target ; ZF= 0 结果不为零(比较不相等),则转移
② 测试CF: JC target ; CF= 1 结果有进位/借位,则转移 JNC target ; CF= 0 结果无进位/借位,则转移
③ 测试SF: JS target ; SF= 1 结果为负时,则转移 JNS target ; SF= 0 结果为正时,则转移
④ 测试OF: JO target ; OF= 1 结果有溢出,则转移 JNO target ; OF= 0 结果无溢出,则转移
⑤ 测试PF: JP target ; PF= 1 结果中1的个数为偶数,则转移 JNP target ; PF= 0 结果中1的个数为奇数,则转移
II. 两个无符号数比较转移指令:一般跟在CMP指令后
①格式: JA / JNBE target ;dst > src 则转移;
②格式: JAE / JNB target ;dst ≥ src则转移;
③格式: JB / JNAE target ;dst < src则转移;
④格式: JBE / JNA target ;dst ≤ src则转移;
III. 两个有符号数比较转移指令:也应紧跟在CMP指令后
①格式: JG / JNLE target ;dst > src 则转移;
②格式: JGE / JNL target ;dst ≥ src则转移;
③格式: JL / JNGE target ;dst < RC 则转移;
④格式: JLE / JNG target ;dst ≤ src则转移
IV. 测试CX:
格式: JCXZ target ;CX=0,则转移
(3) 循环控制指令
① 计数循环指令:
格式:LOOP disp8 ; CX ≠ 0,(IP + disp8)-> IP
功能:CX 为循环次数计数器,循环次数置入CX中, 每执行一次 LOOP 指令,CX-1 ->CX, 如果 CX ≠ 0,则 IP+disp8 ->IP,即发生转移; 如果 CX = 0,顺序执行。
②结果为零或相等时循环指令: 一般用在CMP指令后
格式:LOOPZ disp8 ; CX≠0 且 ZF=1时,(IP+disp8)->IP
LOOPE disp8
功能:每执行一次该指令,CX-1-> CX,判 CX≠0 且 ZF=1时, 则产生转移,即:(IP+disp8)->IP
③结果不为零或不相等时循环指令:一般用在CMP指令
格式:LOOPNZ disp8;CX≠0 且 ZF=0时,(IP+disp8)->IP
LOOPNE disp8
功能:每执行一次该指令,CX-1 ->CX,判 CX≠0 且 ZF=0 时, 则产生转移,即:(IP+disp8)->IP - 子程序调用和返回
(1) 段内直接调用:(相对调用)
格式:CALL disp16;16位相对偏移地址disp16
功能:① IP ->堆栈;即将IP的内容压栈,保存返回地址,即断点。 其内容为CALL指令下一条指令的有效地址EA。
② IP+disp16 ->IP;将指令中的disp16和IP相加后送 IP, 使程序的执行发生转移。
③ disp16可以使用标号地址。(过程名)
(2) 段内间接调用:(绝对调用)
格式:CALL REG / MEM
功能:① IP->堆栈;即将IP的内容压栈,保存返回地址,即断点。
② (EA) ->IP; EA是由REG / MEM操作数指出的子程序在 本代码段内的有效地址。从而使程序的运行发生转移。
③ EA由寄存器或存贮器提供。
(3) 段间直接调用:(子程序不在当前代码段)
格式:CALL addr32 ; (addr32:或远过程名)
功能:① CS->堆栈;IP->堆栈;保存返回地址,即断点。
② addr32:32位地址中第一个字->IP;第二个字->CS; 程序的运行转移到另一个代码段中,开始执行子程序。
(4) 段间间接调用:(子程序不在当前代码)
格式:CALL MEM ;
功能:① CS->堆栈;IP->堆栈;保存返回地址,即断点。
②指令提供了四个字节(双字)MEM 操作数的寻址方式
③存贮器中的第一个字->IP;第二个字->CS;程序运行发生转移。
(5) 子程序返回指令:(该指令写在子程序最后)
格式:RET/RETF ;将栈顶原保护的断点出栈
功能:① 段内返回:(SP)->IP ;SP+2 ->SP :修改栈指针
②段间返回:(SP)->IP ;SP+2-> SP :修改栈指针 (SP)->CS ; SP+2 ->SP :修改栈指针 - 中断和中断返回指令
(1) 软中断指令:
格式:INT n ; n 为中断类型号,八位二进制数0-255。
功能:①置 IF = 0;关闭中断,不允许外部中断的干扰;
② FR->栈区;保护现场,即中断服务前FR的状态;
③ CS->栈区; IP->栈区;保护断点:即返回地址;
④ 0 ->CS;[CS×16+n×4]->IP;修改IP指针 [CS×16+n×4+2]->CS;修改段基地址
⑤ CPU 转去执行相应的中断服务服务程序。
(2) 中断返回指令:(该指令写在中断服务程序结尾处)
格式:IRET ;其作用类似子程序返回指令
功能:①(SP)->IP,SP+2-> SP;弹出断点:即返回地址
(SP)->CS,SP+2-> SP;
(SP)->FR,SP+2-> SP;恢复现场
② 置 IF = 1;开放中断允许。
③由于出栈修改了 IP 和 CS,即恢复断点的地址,使CPU返回 原断点处,继续执行主程序。
(6)处理器控制指令: - 标志位设置指令:
① 格式:CLC ;功能:使 CF=0,即进位标志清零。
② 格式:STC ;功能:使 CF=1,即进位标志置1。
③ 格式:CMC ;功能:使 CF-> CF,即进位标志取反。
④ 格式:CLD ;功能:使 DF=0;即方向标志位清零。
⑤ 格式:STD ;功能:使 DF=1;即方向标志位置1。
⑥格式:CLI ;功能:使 IF=0;中断标志清零(关中断)
⑦格式:STI ;功能:使 IF=1;中断标志置1(开中断) - 同步指令
① 处理器交权指令ESC
格式:ESC ext-op , mem
功能:使外部处理器能从8086指令流中取得它们的操作指令,同时 指示8086CPU取出内存操作数,放到数据总线上,一供使用。
② 等待指令WAIT
格式:WAIT
功能:该指令与ESC指令配合使用,在WAIT指令期间,CPU测试 TEST 引脚状态;当TEST有效时,退出等待状态执行后续指令, 否则继续等待。TEST 信号由协处理器发出。
③ 总线封锁前缀指令LOCK:是一个前缀,应放在其它操作指令前
格式:LOCK ;
功能:封锁总线。在执行指令期间,不允许其它设备对总线进行访问
④ 暂时指令HLT
格式:HLT
功能: CPU处理暂停状态,等待外设的中断请求。
⑤ 空操作指令NOP
格式:NOP
功能:不产生任何结果,用于延时3个T周期