第二章微型计算机指令系统 指令 ------ 实现微机算术 逻辑运算和控制功能 重点 : *1 存储器寻址方式 2 标志传送 3 转移控制( 转移指令 过程调用 中断 ) 1
指令 (Instruction) 指令集或指令系统 (Instruction Set) 指令的表示 指令与指令系统 指示 CPU 执行某种规定操作的命令 某一 CPU 所能执行的全部指令的集合 定义了程序员能使硬件完成的基本操作 (CPU 基本性能 ) 机器码 ( 指令 ) 05H 00H 10H B9H 25H 00H 01H C8H 汇编语言 / 助记符 (Mnemonic Symbol) ADD AX,1000H MOV CX,0025H ADD AX, CX 2
机器码 ( 指令 ) 与汇编语言 / 助记符 指令内容 助记符内容 代 B0H 05H 04H 08H 1011 0000 0000 0101 0000 0100 0000 1000 MOV AL,05H ADD AL,08H 码 段... 3
指令体系与 8086 指令 指令 ---- 指示 CPU 执行某种规定操作的命令 复杂指令计算机精简指令计算机 (CISC Complex (RISC Reduced Instruction Set Computer) 例 : 80X86/Pentium 变字节 1-16 字节, 种类多 APARC,, PowerPC, 代码利用率低 Alpha 指令简单, 复杂功能代码 8086 存储器利用率低指令向下兼容 8080/8085 指令, 共 92 种基本指令 8086/8088 指令系统 ( 六大类 ) 数据传送 算术运算整型数据处理 逻辑运算与位操作逻辑数据处理 串操作字符型数据处理 转移控制程序流控制处理 ( 条件 / 无条件 ) MPU 控制 通用 / I/O / 目标地址传送 / 标志传送 系统控制管理 4
8086/8088 指令格式 字段 1 字段 2 字段 3 字段 4 字段 5 字段 6 Prefix OP Code Mode r/m s-i-b disp data 1~4 字节 1~2 字节 1 字节 1 字节 0,1,2,4 如 : 04H 08H ( ADD AL, 08H ) 字节 05H 00H 10H ( ADD AX,1000H ) 指令码 = 操作码 (Opcode) + 操作数 (Operand=Oprd1,Oprd2) 解决 :1 什么操作 2 涉及的数如何获取和结果如何存放 寻址 (Addressing) 方式 : 7 种 ( 目标 / 源操作数 ) 5
操作数的存放形式与格式 操作数的存放 : 3 种基本形式 : 1 直接放在代码段中, 是指令的一部分如 : MOV AL, 05H 称为 立即数操作数 2 存在 CPU 的寄存器中如 : MOV AL, AH 称为 寄存器操作数 3 存在存储器 ( 非代码段 ) 中如 : MOV AX,[8000H ] 称为 存储器操作数 数据类型 1/2/4 字节 L 3B000 3B001 3B002 3B003 H ML MH H 物理存储格式 6
操作数的三种存放形式 CPU( 微处理器 ) 寄存器组 AH AL BH BL CH CL DH DL SI DI BP SP 运算器 AX BX CX DX PSW 标志寄存器 指令队列 DS ES SS CS IP 地址加法器 数据暂存器 指令译码器 总线接口控制电路 执行部件控制电路 总线 地址总线 AB 数据总线 DB 控制总线 CB 存储器 指令 1 地指令 2 指令 3 址指令 4 译 数据 1 码数据 2 器 9Ah 7
如何找到操作数 寻址 (Addressing) 方式 : 7 种寻址方式 其中 5 种对应着存放在存储器中 第一类寻址方式 ( 简单 非存储器寻址方式 ) 1 立即寻址 (Immediate Addressing) 立即数操作数 MOV AL,100; MOV CX,2000H;( MOV DS,200H ) 2 寄存器寻址 (Register Addressing) 寄存器操作数 MOV DS,AX; MOV CX,BX;MOV SI,DX 8
第二类寻址方式 ( 复杂 存储器寻址方式 ) 3 直接寻址(Direct Addressing) MOV AX,[2000H ] ; MOV AL,BUFFER( 内存 ); 4 寄存器间接寻址 (Register Indirect Addressing) MOV AX,[SI]; MOV BL,[DI]; MOV CH,[BX]; MOV DX,[BP] 5 变址寻址 (Indexed Addressing) 索引 -- 源变值 R:SI/ 目标变址 R:DI EA=[SI]/[DI]+ 位移量 MOV AX,[SI+6];MOV DL,TABLE[SI] 一维数组 6 基址寻址 (Based Addressing) [BX]/[BP] MOV AL,[BX+100];MOV DX,TABLE[BP] 7 基址 -- 变址寻址 (Based Indexed Addressing) EA=[BX]/[BP]+[SI]/[DI]+COUNT MOV AL,[BX][SI]COUNT, MOV DX,[BP+DI+COUNT] 二维数组 9
8086/8088 的内部寄存器 14 个 16 位寄存器 :8 通用寄存器 /4 段 /2 控制寄存器 P20 图 1.10 10
第二类寻址方式 ( 复杂 存储器寻址方式 ) 3 直接寻址(Direct Addressing) MOV AX,[2000H ] ; MOV AL,BUFFER( 内存 ); 4 寄存器间接寻址 (Register Indirect Addressing) MOV AX,[SI]; MOV BL,[DI]; MOV CH,[BX]; MOV DX,[BP] 5 变址寻址 (Indexed Addressing) 索引 -- 源变值 R:SI/ 目标变址 R:DI EA=[SI]/[DI]+ 位移量 MOV AX,[SI+6];MOV DL,TABLE[SI] 一维数组 问 题 6 基址寻址 (Based Addressing) [BX]/[BP] MOV AL,[BX+100];MOV? DX,TABLE[BP] 物理地址 =? EA=[BX]/[BP]+[SI]/[DI]+COUNT 有效地址 EA=? MOV AL,[BX][SI]COUNT, MOV DX,[BP+DI+COUNT] 二维数组 7 基址 -- 变址寻址 (Based Indexed Addressing) 默认段寄存器 =? 11
8086/8088 的 20 位地址总线 寻址范围 :1M=64K 的 16 倍 8080/8085-16 位地址线寻址范围 :64K 12
存储器寻址 物理地址获取 物理地址 PA 操作数存放地址 (20 位地址!) 物理地址 PA = 段基地址 SA+ 偏移地址 EA(Effective Addr) PA=SA*16+EA 书面表示 SA:EA 1000:2000H 有效地址 EA= 偏移 (Offset) 地址 ( 直接寻址 / 寄存器间址表示 ) MOV AX,(DS:)[8000H ]; MOV AX,[BX] ; MOV CL,CS:[2000H] 段基地址 : 默认段 =CS/DS/ES/SS P59 表 2.3 默认段寄存器一般数据, 直接寻址 BX DI EI, DS 代码 BP,SP SS 特殊指令 始终 CS(:IP) 例 ( 串操作 ) EI ES 段超越非默认段寄存器, 需说明 ( 指令加段超越前缀 ) 13
如 : MOV AX,DS:[2000H]; 简化 MOV AX, [2000H];DS( 数据段 ) 注意 : 8086/8088 的 ( 存储器 ) 地址线有 20 位 DS:3000H 比较 : MOV AX,ES:[2000H] ; 段超越, 操作数在附加段 14
第二章微型计算机指令系统 8086/8088 指令系统 ( 六大类 ) 数据传送 (DATA TRANSFER) 通用 / I/O / 目标地址传送 / 标志传送 算术运算 (Arithmetic) 逻辑运算与位操作 (Logic) 串操作 (String Manipulation) 转移控制 (Control Transfer) MPU 控制 (Processor Control) 整型数据处理逻辑数据处理字符型数据处理程序流控制处理系统控制管理 15
通用传送 (GP transfer) 数据传送指令 ( 一 ) MOV,PUSH/POP,XCHG,(XLAT) 1. MOV DST,SRC ; BYTE/WORD 传送, 各寻址方式 ; MOV AX,80A0H(BX,[SI],[3000]) R R/M,I( 直接数 ) R/M;R/M SR( 段寄存器 ) 禁止 :M M;I SR;SR SR( 例 : 数据块移动 ) 2.PUSH SRC; (SP) (SP)-2;((SP)+1:(SP)) (SRC) POP DST; (DST) ((SP)+1:(SP));(SP) (SP)+2; SRC/DST R/M/SR ( 但 DST 不可为 CS!!!)SP 偶数!! 16
通用传送指令 --- 堆栈 (STACK) 重要用途 : 保存 INT 断点 /CALL 返回地址 / 数据信息 引伸 : 临时保存数据, 传递信息 特点与规则 堆栈 : 内存特殊区域 操作按字 (2 字节 ) 进行 PUSH 指令从高地址 低地址增长, POP 相反 操作规则 FILO (First-In-Last-Out) 栈底 SS:FFFFH( 堆栈的最大地址 ) SP 为当前栈顶指针 (EA)( 末指针 ) 17
通用传送指令 --- 堆栈传递数据 (PUSH AX 之前 ) 18
通用传送指令 --- 堆栈传递数据 (PUSH AX 之后 ) 19
执行 PUSH AX 前 (a) 后 (b) 堆栈及指针变化 20
执行 POP BX 前 (a) 后 (b) 堆栈及指针变化 相当于 : MOV BX, AX 21
通用传送指令 --- 堆栈应用 ( 一 ) 使用过程 / 关键 PUSH AX; 堆栈平衡防止溢出 PUSH BX PUSH/POP 配对使用 PUSH CX; /CALL-RET/INT--IRET). 8086: 堆栈段 SS:SP MOV AX,[BP-2]; 访问堆栈内容用途 : 保护 / 传递数据 MOV BX,[BP-4]; 例 :CALL ( 嵌套 )-- MOV CX,[BP-6]; 恢复 AX,BX, INT( 嵌套 ) CX; 函数调用 ; MOV BP,SP;. ADD SP,6 ; 代替 POP 平衡堆栈 22
数据传送 --- 通用传送指令 ( 二 ) 3.XCHG dest, src ;(dest) (src) R R/M; 禁止 M M 例 XCHG AL,AH; XCHG X1[SI],AX 4.XLAT [src_table]; (AL) ((BX)+(AL)) 查表转换 ; 可段超越例 ES:XLAT 运行前 BX 须赋值, 例 LEA BX,src_table; MOV AX,SEG src_table; MOV DS,AX; MOV 23
数据传送 ---I/O 端口 (Port) 传送指令 IN AL/AX, portno; 8 位立即数 portno:0~255 OUT portno,al/ax; IN AL/AX,DX; DX:0~64K(0FFFFH) OUT DX,AL/AX; 字 IN/OUT L,H 例 IN AL, 40H OUT 40H, AL MOV DX, 3F8H IN AL, DX OUT DX, AL ; 接收 ; 发送 24
数据传送 --- 地址对象传送指令 LEA reg16, mem16 ; 取有效地址, 近地址指针 ( 段内 ) reg16 比较 MOV/ LEA AX,BUFFER, 直接 -mem=offset xxxx 例 LEA AX,V1[BX][SI] (Address-object Transfer) 当 BX=2000H, LEA SI,[BX]300H Si=2300H FAR Pointer 16 位段址 :16 位偏址存放格式 : ( 例 )LDS SI,[BX]/LES DI,[BX] LDS reg16,mem32; mem32 存放 FAR P 数据 (4bytes) DS:reg16 (IP:CS L-H 存放 ) LES reg16,mem32 ; mem32 存放 FAR P 数据 (4bytes) ES:reg16 25
数据传送 --- 标志传送指令 (Flag Register Transfer) LAHF;(Load AH from flags) F 低 8 位 AH (SF ZF XX AF XX PF XX CF) SAHF; (Store AH to Flags) AH Flags 低 8 位 PUSHF; (SP) (SP)-2; ((SP)+1:(SP)) (FLAGS) POPF; (FLAGS) ((SP)+1:(SP)); (SP) (SP)+2; 26
第二章微型计算机指令系统 8086/8088 指令系统 ( 六大类 ) 数据传送 (DATA TRANSFER) 通用 / I/O / 目标地址传送 / 标志传送 算术运算 (Arithmetic) 逻辑运算与位操作 (Logic) 串操作 (String Manipulation) 转移控制 (Control Transfer) MPU 控制 (Processor Control) 整型数据处理逻辑数据处理字符型数据处理程序流控制处理系统控制管理 27
3 个控制标志位 标志状态寄存器 Flags 6 个算术和逻辑运算结果特征 溢出标志 方向 中断允许 =1 跟踪 符号位 零标志位 半进位 奇偶位 =1 偶 借进位 28
标志状态寄存器 Flags 6 个算术和逻辑运算结果特征 CF 进位标志位 当进行加法或减法运算时, 若最高位发生进位或借位则 CF=1, 否则 CF=0 PF 奇偶标志位 当逻辑运算结果中 1 的个数为偶数时 PF =1, 为奇数时 PF=0 AF 辅助进位位 在 8(l6) 位加减法操作中, 低 4 位向高 4 位有进位 借位发生 ZF 零标志位 当运算结果为零时 ZF=1, 否则 ZF=0 SF 符号标志位 当运算结果的最高位 MSB 为 1 时 SF=1, 否则 SF= 0 OF 溢出标志位 当算术运算的结果超出了带符号数的范围, 即溢出时,OF= 1, 否则 OF=0 8 位 /16 位带符号数范围 29
算术运算 (Arithmetic) 指令 (1) ADD (Addition) 加法 (dest) (dest)+(src) 例 ADD dest,src; 8 位 /16 位操作数, 影响 FLAGS ADD AX,[BX]; ADD CL,10H;ADD SP,2; ADD [2000H], AL; ADD WORD PTR[BX], 20 AL=7EH(01111110B) AH=5BH(01011011B); ADD AL,AH AL=D9H(11011001B) 问题 : 如何影响标志位? 30
算术运算 (Arithmetic) 指令 (1) 例 AL=7EH(01111110B) AH=5BH(01011011B); ADD AL,AH AL=D9H(11011001B) 影响标志位 : CF=0( 加法 无进位 ); PF=0 (1 的个数为奇数 注 : 非逻辑运算, 不必关注 ) ; AF=1( 低 4 位向高 4 位有进位发生 ); ZF=0( 结果不为零 ); SF=1( 结果的最高位 MSB 为 1); OF=1 ( 运算的结果超出了带符号数的范围 ) 31
算术运算 (Arithmetic) 指令 (2) ADC (ADD with Carry) (dest) (dest)+(src)+(cf) 例 :MOV BX, OFFSET FIRST; 多位数连加 : L H MOV SI, OFFSET SECOND MOV AX, [SI] ADD [BX], AX MOV AX, [SI+2] ADC [BX+2],AX; 类似 P77 例四字节 L H 逐个 ADC INC (Increment by 1) (dest) (dest)+1 加一操作 INC AX; INC DL; INC WORD PTR ES:[2000H] INC BYTE PTR[BX]; ( 伪操作 PTR 参考书 153-4) 32
算术运算 (Arithmetic) 指令 (3) AAA*(ASCII adjust for Addition) 非压缩 BCD 加法调整 ( 单字节 ) 只对 Unpacked BCD (00-09H) 有意义 ; 隐含为 :AL,AH(AH:00~08,AL:00~09) 等效 :IF((AL)&(0FH)>9)OR (AF)=1 THEN (AL)+6; AH+1;AF=CF=1; (AL)&0FH ELSE (AL)&0FH; ( 应 AH=00~08,AL=00~09) 例 :MOV AH,0 MOV AL,7 MOV BL,8 ADD AL,BL;(AL=0FH); AAA; (AH=1,AL=5) 连加? 打 * 指令一般了解 33
算术运算 (Arithmetic) 指令 (4) DAA (Decimal adjust for Addition) 压缩 BCD 加法调整 ( 单字节 ) 只对 Packed BCD (00-99H) 有意义 ; 等效 :IF((AL)&(0FH)>9)OR (AF)=1 THEN (AL)+6; AF=1; IF((AL)&(9FH)>9)OR (CF)=1 THEN (AL)+60H; CF=1; 例 :68+59=? MOV AL,68H; MOV BL,59H; ADD AL,BL;(AL=C1H,AF=1); DAA;(CF=1=AF, AL=27H, 可连加 ) 上例的 DAA 调整, 相当于加 66H, 即相当于 ADD AL,66H 34
算术运算 (Arithmetic) 指令 (5) 减法乘法除法 SUB/SBB/DEC/ MUL/AAM DIV/AAD AAS/DAS*( 调整 ) IMUL( 有符号乘 ) IDIV ( 有符号除 ) 减法指令 ( 注 :CF=1 借位 ) SUB AL,CH; SUB BYTE PTR[2000H], 20; SBB AX, [BP+1000]; DEC SI; DEC BYTE PTR [SI]; 打 * 指令一般了解 (dest) (dest)-(src) (dest) (dest)-(src)-(cf) (dest) (dest)-1 35
算术运算 (Arithmetic) 指令 (6) NEG (Negate) 8 位 /16 位求补 ( 改变符号 ) 绝对值不变 NEG dest; (dest) 0-(dest), 影响 6 个运算标志位例 : NEG AL; NEG BX; NEG BYTE PTR CS:[2000H] CMP (Compare) (dest)-(src), 影响 6 个运算标志位 例 :CMP AL,CH; CMP AX,[BX]; CMP BYTE PTR[2000H], 20 36
算术运算 (Arithmetic) 指令 (7) 16 位乘法 MUL src 默认 :AX* (src) 积 = DX( 高 16 位 ) AX( 低 16 位 ) 8 位乘法 MUL src 默认 :AL* (src) 积 = AX (16 位 ) 16 位除法 DIV src 默认 : 被除数 DX( 高 16 位 ) AX( 低 16 位 ) / (src) (16 位 ) 结果 DX= 余数 (16 位 ); AX= 商 (16 位 ) 注意 : 除 0/ 溢出 ( 字节除 : 商 >255 或字除 : 商 >65535) 除零中断 8 位除法 DIV src 默认 : 被除数 AX (16 位 ) / (src) (8 位 ) 结果 AH= 余数 (8 位 ); AL= 商 (8 位 ) 37
算术运算 (Arithmetic) 指令 (8) IMUL/IDIV IMUL src; IDIV src; 有符号数乘 / 除法 打 * 指令一般了解 AAM* (ASCII adjust for Multiply) :Unpacked BCD 调整 等效 :(AH) (AL)/10; ( 商 ); (AL) (AL)%10 ( 余数 ) SF,ZF,PF 单字节! AAD*( ASCII adjust for Divide):Unpacked BCD 调整 (AL) (AH) *0AH+(AL); AH=0 单字节! CBW/CWD 字长扩展 ( 字节 字 ; 字 双字 ) 38
第二章微型计算机指令系统 8086/8088 指令系统 ( 六大类 ) 数据传送 (DATA TRANSFER) 通用 / I/O / 目标地址传送 / 标志传送 算术运算 (Arithmetic) 逻辑运算与位操作 (Logic) 串操作 (String Manipulation) 转移控制 (Control Transfer) MPU 控制 (Processor Control) 整型数据处理逻辑数据处理字符型数据处理程序流控制处理系统控制管理 39
逻辑运算与移位 (Logical & shifting) 逻辑运算 AND dest, src; AND AX, [BX]; AND CL,08H OR dest, src; OR AL,55H; OR WORD PTR [BX], DH XOR dest, src (logical Exclusive or ) (dest) (dest) (src) XOR AX,AX; XOR CL, [BX] TEST dest, src 逻辑与测试, 仅影响标志位 TEST AL,80H; TEST AX,0FFFFH; NOT dest ;B:dest=255-dest; W:dest=65535-dest NOT AL; NOT BYTE PTR ES: [2000H] 40
逻辑运算与移位 (Logical & shifting) 逻辑运算. 8086/8088 无直接位操作 : 如 SETB/CLRB/JB/JNB) 实现置位 ( 置 1), 可采用 OR 指令如 : OR AL, 80H ; 实现 BIT7=1 实现复位 ( 清 0) 可采用 AND 指令如 : AND AL, 7FH; 实现 BIT7=0 实现某些位求反, 可采用 XOR 指令如 :MOV AL, 0FH; (AL)=(00001111B) XOR AL, 0AAH;(AL)=(10100101B) 实现了 BIT1,3,5,7 位求反 41
逻辑运算与移位 (Logical & shifting) 逻辑移位 ( Logical shifting) SHL/SAL (SHift logical Left/Shift Arithmetic Left) 1 位 /CL 位, 相当于无符号数 *2/ 无符号数 *2 的 CL 次方位 SHL/SAL dest,1 ; SHL AL,1; SHL CX,1 SHL/SAL dest,cl SHL WORD PTR[BX],CL CF dest( MSB LSB ) 0 移一次 当 MSB CF, 则 OF=1 SHR(Shift logical right) 相当于无符号数 /2 SHR dest, 1 /CL 0 dest ( MSB LSB ) CF 42
逻辑运算与移位 (Logical & shifting) 算术移位 (Arithmetic Shifting) SAR (Shift Arithmetic Right) 相当于带符号 /2 SAR dest, 1 ; SAR dest, CL MSB dest(msb LSB ) CF MOV AL, 10001000B; SAR AL,1 ;10001000B=(88H= -78H) AL=11000100B(C4H=-3CH) 43
逻辑运算与移位 (Logical & shifting) 循环移位指令 (Rotate Shifting) ROL(Rotate left) ROL dest 1/CL CF 如 :AL=10001000B ROL AL, 1 AL= 00010001B CF=1 ROR (Rotate right) CF ROR dest 1/CL AL=84H 48H ( 高低四位交换 ) 44
逻辑运算与移位 (Logical & shifting) 循环移位指令 (Rotate Shifting) RCL(Rotate Through Carry Flag left) RCL dest 1/CL C F Dmax D1 D0 RCR(Rotate Through Carry Flag right) RCR dest 1/CL 45
第二章微型计算机指令系统 8086/8088 指令系统 ( 六大类 ) 数据传送 (DATA TRANSFER) 通用 / I/O / 目标地址传送 / 标志传送 算术运算 (Arithmetic) 逻辑运算与位操作 (Logic) 串操作 (String Manipulation) 转移控制 (Control Transfer) MPU 控制 (Processor Control) 整型数据处理逻辑数据处理字符型数据处理程序流控制处理系统控制管理 46
3 个控制标志位 标志控制寄存器 Flags TF 跟踪标志位 TF= 1, 使 CPU 处于单步执行指令的工作方式 这种方式便于进行程序的调试 每执行一条指令后, 自动产生一次内部中断, 从而使用户能逐条指令地检查程序 IF 中断允许标志位 IF= l 使 CPU 可以响应可屏蔽中断请求 IF= 0 使 CPU 禁止响应可屏蔽中断请求,IF 的状态对不可屏蔽中断及内部中断没有影响 DF 方向标志位 DF= l 使串操作按减地址方式进行 也就是说, 从高地址开始, 每操作一次地址减小一次 DF =0 使串操作按增地址方式进行 47
8086/8088 的内部寄存器 14 个 16 位寄存器 :8 通用寄存器 /4 段 /2 控制寄存器 P20 图 1.10 48
串操作 (String Manipulation) MOVSB-W/CMPSB-W/ SCANSB-W/LODSB/STOSW B/W B/W SI DI CX 个单元 ( 字节或字 ) 方向 + 标志位 DF=0 SI=src pointer (DS); DI=dest pointer(es); DF 控制 INC(DF=0)/DEC (DF=1); B+-1/W+-2 重复前缀 : REP(Z)=REPE REPNZ=REPNE 49
串操作功能与默认操作数 REP(Z) MOVS (CX 次 ) REPE(Z)CMPS/SCAS ( 重复至 CX=0 或 ZF=0) REPNE(ZF=0)Repeat while (CX 0 )and (ZF=0) 以指令结果与 CX 计数为条件 -- 重复前缀本身影响标志位 (CX-1)? MOVSB /W----((ES):(DI)) ((DS): ( SI)) 不影响标志位 CMPSB/W- -((DS): ( SI)) --((ES):(DI)) 影响标志位 SCASB/W---- (AL)/(AX) ((ES): (DI)) 影响标志位 LODSB/W(load String): (AL/AX) ((DS): (SI)) STOSB/W(Store string) : (AL/AX) ((ES): (DI)) 50
第二章微型计算机指令系统 ( 续 ) 8086/8088 指令系统 ( 各类重点 ) 数据传送 (DATA TRANSFER) 重点 : 寻址 (20 位地址, 段寄存器 ) 算术运算 (Arithmetic) 关注 : 标志位 逻辑运算与位操作 (Logic) 简单 ( 数据处理 ) 串操作 (String Manipulation) 特殊操作 ( 硬记 ) 转移控制 (Control Transfer) 程序流控制 ( 重要 ) MPU 控制 (Processor Control) 系统控制 ( 重要 ) 51
转移控制 (Control Transfer) ---- 程序流控制两大类 : 转移控制 (Control Transfer) 过程调用 ( Call a procedure ) 转移控制要点 : ⑴ 转移到新地址 -CS:IP ⑵ 什么条件下转移 52
运行程序 ( 数据 ) 分段存储 分段结构 最多 4 个活动段 0000:0~3FF SS:SP 栈底 DS ES CS:IP 中断向量区 ( 系统专用 ) 堆栈段数据段代码段 FFFF:0 系统起始运行程序 53
` 转移控制 (Control Transfer) 无条件跳转 (Unconditional Jump) CS:IP= Instruction Pointer 下条指令地址 ( 指针 ) JMP SHORT_LABEL; 近短跳转 IP 128 +127 SHORT 向前引用! IP=IP+disp8 JMP(JUMP)NEAR_LABEL IP=IP+disp16 段内跳转 JMP FAR_LABEL; 段间跳转 CS:IP= 新地址 JMP SHORT JMP NEAR PTR JMP FAR PTR REG16/mem16 JMP 2000H; JMP BX; JMP 0FFFFH:0 ( 热启动 ) JMP FAR PTR TABLE[SI]; JMP NEAR PTR [BP][DI] 54
转移控制 (Control Transfer) 条件跳转 (conditional Jump) ( 利用 CMP,TEST 计算 移位指令等结果改变程序流 ) JCC SHORT_LABEL; 限近短跳转 IP 128 +127 满足条件 IP=IP+disp8, 否则顺序执行 (IF ELSE) JZ/JE --JNZ/JNE (ZF)=1 --(ZF)=0 JS --JNS (SF)=1 --(SF)=0 JP/JPE --JNP/JPO (PF)=0 --(PF)=1 JO --JNO (OF)=1 --(OF)=0 JC --JNC (CF)=1 --(CF)=0 55
转移控制 (Control Transfer) Unsigned 大小比较 条件跳转 (conditional Jump) JB/JNAE --JNB/JAE JA/JNBE --JNA/JBE (CF)=1 -(CF)=0 (CF)=0&((ZF)=0 --(CF)=1 OR (ZF)=1 ( 运算 ++,+-,--,-+ 后 ) 无符号数大于条件 Signed 大小比较 JG/J NLE --JNG/JLE (SF)=(OF) &(ZF)=0 ---(SF) (OF)OR(ZF)=1 JL/JNGE --JNL/JGE (SF) (OF) &(ZF)=0 ---(SF)= (OF) OR(ZF)=1 56
转移控制 (Control Transfer) 循环控制 (Loop) LOOP short_label ; loop CX times LOOPZ/LOOPE short_label; (loop while zero/equal) 循环直到 (CX)=0 or (ZF=0) LOOPNE/LOOPNZ short_label; (Loop while NZ/NE) 循环直到 (CX)=0 or (ZF=1) JCXZ if CX=0 Jump to (Jump On CX Zero) CX 为零控制调转 57
过程调用 (Call a procedure ) CALL 段内 \ 段间 : 直接 / 间接调用 ( 过程 / 子程序 Subroutine) RET (RETF) 过程返回 ( 分远近, 产生不同 RET 码 (C3/CBH) 不但 CS:IP 发生变化 ( 新地址 ), P66 图 2.11 而且堆栈 SP 及其内容均发生变化 栈底 58
过程调用 (Call a procedure ) CALL NEAR_PROC; (SP) (SP)-2, ((SP)+1,(SP)) (IP); (IP) (IP)+proc_disp CALL reg16/mem16. ; (IP) reg16/mem16 CALL FAR_PROC; (SP) (SP)-2,((SP)+1,(SP)) (CS); (CS) SEG F_PROC (SP) (SP)-2,((SP)+1,(SP)) (IP); (IP) OFFSET F_PROC CALL MEM32; (CS) MEM32+2, (IP) MEM32 例 :CALL 2000H; CALL BX; CALL NEAR PTR ES:[SI] CALL 2000:3000H; CALL FAR PTR[2000H] 59
过程返回 (Return From Call ) RET(C3H ); (IP) ((SP)+1:(SP)), (SP) (SP)+2 RET pop_value ;(C2H data_low data_high) (IP) ((SP)+1:(SP)), (SP) (SP)+2; (SP) (SP)+pop_value =ADD SP,Pop_value RETF (CBH) ; (IP) ((SP)+1:(SP)), (SP) (SP)+2 (CS) ((SP)+1:(SP)), (SP) (SP)+2 RETFpop_value ; (CAH data_low data_high) IP:CS 弹出 (SP) (SP)+pop_value 60
第二章微型计算机指令系统 ( 续 ) 8086/8088 指令系统 ( 各类重点 ) 数据传送 (DATA TRANSFER) 重点 : 寻址 (20 位地址, 段寄存器 ) 算术运算 (Arithmetic) 关注 : 标志位 逻辑运算与位操作 (Logic) 简单 ( 数据处理 ) 串操作 (String Manipulation) 特殊操作 ( 硬记 ) 转移控制 (Control Transfer) 程序流控制 ( 重要 ) MPU 控制 (Processor Control) 系统控制 ( 重要 ) 61
微机系统 结构示意图 地址总线 AB CLK CPU 存储器 数字 I/O 接口 输入出设备 模拟 I/O 接口 输入出设备 数据总线 DB 控制总线 CB 62
中断 (Interrupt) 控制 CPU 与外设交换信息的一种方式 == 硬件手段影响和改变 CPU 执行程序的顺序 ( 程序流 ) 断点 返回断点 中断过程 : 执行正常程序 事件 / 请求服务 - -- 打断 / 暂时中断原程序 == 执行中断处理程序 --- 完毕 -- 在断点处恢复原程序 (IRET) 主程序流中断服务中断嵌套 63
3 个控制标志位 标志控制寄存器 Flags TF 跟踪标志位 TF= 1, 使 CPU 处于单步执行指令的工作方式 这种方式便于进行程序的调试 每执行一条指令后, 自动产生一次内部中断, 从而使用户能逐条指令地检查程序 IF 中断允许标志位 IF= l 使 CPU 可以响应可屏蔽中断请求 IF= 0 使 CPU 禁止响应可屏蔽中断请求,IF 的状态对不可屏蔽中断及内部中断没有影响 DF 方向标志位 DF= l 使串操作按减地址方式进行 也就是说, 从高地址开始, 每操作一次地址减小一次 DF= 0 使串操作按增地址方式进行 64
8088 中断结构 直接执行软件中断 / 指令执行结果 除零 (INT 00H) 单步 (INT 1) IF=1 TF=1 溢出 (INTO INT 04H) 软件中断调用 (INT xxh) 内部中断 非屏蔽中断 NMI(Non-MaskableInterrupt) 可屏蔽中断 INTR(IF=1) NMI 2 中断逻辑 n 4 0 1 INTR 外部中断 IRQ0 IRQ7 INT n INTO 除法错单步 8259 65
中断方式下 CPU 执行程序流程 外 设 发申请 中断服务程序 发申请 中断服务程序 66
8086/8088 中断过程 保护断点 (F 入栈 ;IF=0 TF=0; CS IP 入栈 ; 中断服务 ( 中断类型号 : n ) (0:4*n 取向量 CS:IP); 返回断点 (IRET: 依次弹出 IP CS F) 67
运行程序 ( 数据 ) 分段存储 分段结构 最多 4 个活动段 0000:0~3FF SS:SP 栈底 DS ES CS:IP 中断向量区 ( 系统专用 ) 堆栈段数据段代码段 FFFF:0 系统起始运行程序 68
INT(Interrupt) INT n ; 中断指令 Interrupt (n 中断类型号 ) (SP) (SP)-2,((SP)+1,(SP)) (FLAGS); 中断向量 xxxxcs:xxxxip (IF) 0 (TF) 0 (SP) (SP)-2,((SP)+1,(SP)) (CS); (CS) [0:n*4+2] (SP) (SP)-2,((SP)+1,(SP)) (IP); (IP) [0:n*4] IRET(Interrupt Return) (IP) ((SP)+1,(SP)), (SP) (SP)+2 (CS) ((SP)+1,(SP)), (SP) (SP)+2 (FALGS) ((SP)+1,(SP)) (IP), (SP) (SP)+2 特例 :INTO (Interrupt if overflow) ==INT 4 (CS) (0:12H),(IP) (0:10H) 单字节指令 69
MPU 控制 (Processor Control 标志位操作 CLC(Clear Carry flag)cf=0 STC(Set Carry flag) CF=1 CMC(CoMplement Carry flag) CF=NOT CF CLD(CLear Direction flag) DF=0 Up STD(SeT Direction Flag) DF=1 Down CLI(CLearInterrupt flag) IF=0 STI(SeT Interrupt flag) IF=1 空操作 / 暂停 NOP ;No Operation(3*T), 空操作 HLT(halt)CPU 暂停 ---( 有效 INTR/NMI/RESET 退出 ) 70
MPU 控制 (Processor Control) WAIT(WAIT while TEST# pin not asserted) 有效 INTR/TEST#=0 结束 ---CPU 与外部硬件同步 ESC(Escape) 扩展指令 : 使其他器件 (External Device) 使用 8086/88 的寻址方式 11011xxx modxxxr/m -----8087 FLD FST FSTP FMUL FTEST, FSTSW Z,PI,Log2,loge. LOCK(lock bus)-- 指令前缀 等待 扩展和锁定 控制总线锁定信号 LOCK#=0( 有效 ) 直到执行完下一条指令 71