第三节 与8086/8088兼容的指令系统一. 概述 二. 数据传送指令 三. 算术运算指令 四. 逻辑运算指令
五. 控制转移指令六. 处理机控制指令 七. 串操作指令(不作要求)
指令:是控制计算机进行各种操作的命令 指令系统: CPU所能执行的各种指令的总和, CPU的指令系统体现了CPU的功能和性能 程序:为实现某一功能而编制的指令序列 指令长度:单字节,双字节,三字节,…… 指令周期:指令执行速度 ……
指令格式例1) 操作码 2) 操作数
操作码ADD
操作数AL,10H数据、程序、堆栈
What to do ? Whom ? Where ? 7种寻址方式个数? 无操作数:NOP 单操作数:INC AL 双操作数:ADD AL , 10H 字节 类型匹配 字 内存 寄存器 I/O端口
类型?
回忆: 高级语言中对 数据/变量的类型要求
指令类型 数 据 传 送 通用传送 地址传送 标志传送 输入输出 加法 算术 运算 减法 乘法 除法 符号扩展 逻辑 操作 逻辑运算 移位 循环移位
助记符 MOV PUSH, POP, XCHG, XLAT , LEA, LDS, LES PUSHF, POPF, LAHF, SAHF IN, OUT ADD, ADC, INC, AAA, DAA SUB, SBB, DEC, NEG, CMP, AAS, DAS MUL, IMUL, AAM DIV IDIV AAD , , CBW, CWD AND, TEST, OR, XOR, NOT SHL, SAL, SHR, SAR ROL, ROR, RCL, RCR
156
指令类型 串 处理 串操作 重复控制 无条件转移 控 制 转 移 循环控制 过程调用 中断指令 处理机控制 条件转移
助记符 MOVS,CMPS,SCAS,LODS,STOS REP,REPE/REPZ,REPNE/REPNZ JMP JE/JZ, JNE/JNZ, JS, JNS, JO, JNO JP, JNP, JC, JNC, JCXZ JA/JNBE, JAE/JNB, JB/JNAE, JBE/JNA JG/JNLE, JGE/JNL, JL/JNGE, JLE/JNG LOOP, LOOPE/LOOPZ, LOOPNE/LOOPNZ CALL, RET INT, INTO, IRET CLC, STC, CMC,CLD, STD, CLI, STI NOP, HLT, WAIT, ESC, LOCK
课堂上主要介绍下列常用的指令(22条) 例子、实验中需要其它指令时再介绍或需自学:数据传送指令: MOV 最常用的指令 通常应成双成对出现
堆栈操作指令: PUSH, POP 输入输出指令: IN, OUT 算术运算指令: ADD,
I/O端口与 AL 之间的数据传送
INC,
DEC, CMP
逻辑运算指令: AND, OR,跳转指令: JMP, 循环指令: LOOP 子程调用与返回指令: CALL, RET 中断调用与返回指令: INT N, 中断控制指令: STI, JZ,
TESTJC 无条件/零/进位当CX≠0时跳转(循环)
程序规模较大时使用
IRET 调用BIOS/DOS功能
CLI 允许/屏蔽硬件中断请求
类型匹配
多字节数 无符号数 整数 字符 ……
少字节数 大小?格式? 有符号数 浮点数 非字符
?
对于双操作数指令,两个操作数的类型应相同ADD MOV MOV MOV AX, CL, AL, AX, BL value 260 70000 1FFH 2ABCDH BL ;若 value 定义为字类型 字节
MOV AL, MOV AL, CMP AX,
?
字
操作数类型的确定
字节类型?字类型?
① 指令中有一操作数难以断其类型, 但有寄存器操作数, 则从寄存器操作数的类型
16位8位 8位AH BH CH DH AL BL CL DL
AX BX CX DX
例:MOV [BX], AL ;字节操作, [BX] ← AL MOV [BX] , AX ;字操作, [BX] ←AL,
[BX+1] ←AH
DS SP SS CS
② 指令中有一操作数难以断其类型, 但有变量,则从变量的类型data segment value1 db ? value2 dw ? data ends …… MOV value1 , 0 MOV value2 , 0 ……
变量定义
内存 value1 00H …. 00H 00H
;字节操作 ;字操作
value2 C语言中 如何定义变量?
③ 指令中两个操作数均难以断其类型, 则需对内存操作数进行强制类型说明。
MOV
[BX],
0
MOV byte PTR [BX] , 0 字节操作, [ BX ] ← 0 MOV word PTR [BX] , 0 字操作, [ BX ] ← 0,
[ BX+1 ] ← 0
操作数寄存器 内 存 操 作 数 内存变量
类型确定根据寄存器名可知其类型 从变量定义可知其类型 从操作数本身难以断其类型, 若另一操作数为寄存器,则从寄存器类型; 否则另一操作数为立即数,需强制类型说明。 (两个操作数不能都是内存操作数)
直接寻址 间接寻址
立即数
0~255字节/字;256~65535字类型不确定 从另一操作数类型
目的操作数 ,源操作数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 寄存器 寄存器 寄存器 寄存器 寄存器 内存变量 直接地址寻址 寄存器间接寻址 内存变量 直接地址寻址 寄存器间接寻址 内存操作数 立即数 立即数 立即数 ,寄存器 ,立即数 ,内存变量 ,直接地址寻址 ,寄存器间接寻址 ,寄存器 ,寄存器 ,寄存器 ,立即数 ,立即数 ,立即数 ,内存操作数 ,寄存器 ,立即数 ,内存操作数
类型可断 类型不可断 类型半可断
内存 操作数
非法组合
请 完 成 类 型 确 定 分 析
IP?,PSW?
指令中操作数的表示符号 data reg segreg mem 或 [ ] src dst ( ) oprd1 oprd2 表示内容 立即数操作数 通用寄存器操作数 8 位:AH、AL、BH、BL、CH、CL、DH、DL 16 位:AX、BX、CX、DX、BP、SP、SI、DI 段寄存器 CS、DS、SS、ES 存储器操作数(5 种寻址方式) 源操作数 目的操作数 寄存器、存储器、端口的内容 两操作数
数据传送指令寄存器 寄存器
最基本、最重要的指令change PROC MOV SI, OFFSET num MOV CL, num MOV CH, 0 MOV AX, 0 MOV DI, 10 next: MUL DI MOV BH, 0 MOV BL, [SI] AND BL, 0FH ADD AX, BX INC SI LOOP next zero: MOV BX, AX RET change ENDP
寄存器寄存器 立即数
内存单元I/O端口 寄存器/内存单元地址总线 AB 输 I/O I/O 入 接 接 设 口 口 备数据总线 DB 控制总线 CB
CPU
存 储 器
输 入 设 备
1)MOV传送指令格式 MOV dst,src
执行常用传送:
( dst ) ← ( src )MOV AL , BL MOV [ BX ] , AL MOV var1 , AL MOV DS , AX MOV AL , [ BX ] MOV AX , var1AL , 9 BX , OFFSET buffer [ value ] , 0 WORD PTR [ BX ] , 1
reg/mem/segreg ← reg
例:
reg
← mem 例:
reg/mem
← data
MOV MOV MOV MOV
MOV指令特点及注意事项: 不允许存储器传送到存储器MOV [ BX ] , v
alue MOV AL,[2000H] MOV [BX], [2000H] MOV [ BX ] ,AL
不允许立即数直接传送给段寄存器MOV DS,1000H MOV AX ,1000H MOV DS,AX 立即数、CS、IP、PSW不能做传送指令的目的操作数
请用DEBUG或 汇编程序等验证之
00000H ……
内存
10000H 指令1 10002H 指令2 10003H 指令3 10004H 指令4 …… ……
CPU立即数 寄存器
40000H 数据1 40001H 数据2
40002H 数据3…… ……
控制器 ALU
寄存器
FFFFFH
利用DEBUG学习指令(示例)编程完成 B5h + 8Fh = ? 学习加法ADD指令及其对状态标志位的影响。
D:\>DEBUG 10110101 -A ;汇编指令 + 10001111 0AF8:0100 MOV AL,B5 进位 1 1 1 1 1 1 1 0AF8:0102 ADD AL, 8F 01000100 0AF8:0104 -R ;显示指令执行前各寄存器的值 AX=0000 BX=0000 CX=0000 DX=0000 、、、、、、 CS=0AF8 IP=0100 NV UP EI PL NZ NA PO NC - T=100 2 ;执行指令,查看结果 AX=0044 BX=0000 CX=0000 DX=0000 、、、、、、 CS=0AF8 IP=0104 OV UP EI PL NZ AC PE CY 0AF8:0104 2080FC01 AND [BX+SI+01FC], AL -
用DEBUG验证指令的正确性D:\MASM>DEBUG -A 1693:0100 MOV ES, DS ^ Error 1693:0100 MOV AX, DS 1693:0102 MOV ES, AX 1693:0104 -
例:将 4000:1000H 内存单元清零
MOV DS ,
4000H
MOV [1000H] , 00H
?
例:将 4000:1000H 内存单元清零MOV MOV MOV MOV MOV AX, DS, BX, AL, [BX], 4000H AX 1000H 00H AL
MOV AX, 4000H MOV DS, AX MOV byte PTR [1000H],00H MOV MOV MOV MOV
MOV MOV MOV MOV
AX, DS, BX, [BX],
4000H AX 1000H 00H
AX, 4000H DS, AX AL, 00H [1000H],AL
???
LEA reg , mem 功能:把内存操作数的偏移地址(OFFSET)传送给指定的16位通用寄存器 例: 两条指令的功能 完全一样
LEA BX , var1 MOV BX , OFFSET var1LEA DX , string MOV DX , OFFSET string LEA SI , xx MOV SI , OFFSET xx 比较: MOV BX , var1 MOV BX , OFFSET var1