1.26k likes | 1.45k Views
3.1 指令格式 / 寻址方式 3.2 8086 指令系统 概述 3.3 8086 指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令 第三章小结 第三章思考题. 第三章 8086指令系统. 汇编语言指令格式与寻址方式 8086 的寻址方式 8086 指令系统. 重 点. 3-1-1 汇编语言指令格式 1. 标号、标示符 2. 指令助记符 3. 操作数 4. 注释. 3-1 汇编语言指令格式与 寻址方式. 操作数. 注释. 指令助记符. 对操作数寻址
E N D
3.1 指令格式/寻址方式 3.2 8086 指令系统概述 3.3 8086指令系统 数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令 第三章小结 第三章思考题 第三章 8086指令系统
汇编语言指令格式与寻址方式 8086的寻址方式 8086指令系统 重 点
3-1-1 汇编语言指令格式 1.标号、标示符 2.指令助记符 3.操作数 4.注释 3-1 汇编语言指令格式与寻址方式 操作数 注释 指令助记符
对操作数寻址 寻址方式 对调用或转移指令寻址 一、立即数寻址: 操作数由指令提供. 例: MOV AL,80 H MOV AX,1090 H MOV CX,100 3-1 -2 8086的寻址方式 指令 数据
指令 内存 EA 数据 20 H 30 H 二、直接寻址 操作数在存储器中,其地址由指令 提供。 例:MOV AX,[ 1070 H ] 若 DS = 2000 H,物理地址为: 21070 H 21071 H AX = 3020 H
指令 寄存器 寄存器 数 据 MOV BX,CS:[ 3000 H ] MOV AH,[ 1000 H ] 21000 H 三、寄存器寻址 操作数在寄存器中。 MOV AH,BL MOV AX,BX MOV CX,AX 56 H
[BX] ;段为DS [BP] ;段为SS [SI] ;段为DS [DI] ;段为DS或ES +8 或 16 位移量 EA= 指令 寄存器 内存 寄存器 EA 数据 四、寄存器间接寻址 操作数在存储器中,存储器的有效地址由寄存器指出。
40 21000 H 5B 21001 H 1、以BX寄存器进行间接寻址—— 数据段基址寻址 例: 若 DS = 2000 H,ES = 3000 H,BX = 1000 H 1)MOV AX,[BX] AX← [21000 H] [21001 H] AX = 5B40 H MOV CX,ES:[BX] AX ← [31000 H] [31001 H]
56 H 4A H 53000H 53001H 34000 H 34001 H 1A H 20 H 2、以BP寄存器进行间接寻址——堆栈段基址寻址 MOV AX,[BP] 若 SS = 5000 H,BP = 3000 H, 将 53020 H、53021 H单元的内容送 AX。 执行结果:AX = 4A56 H 3、以SI、DI寄存器进行间接寻址——变址寻址 1) MOV AX,[SI] 若 CS = 3000 H,SI = 4000 H, EA=4000H,物理地址=34000H, 执行结果: AX=201A H
2)MOV BX,[DI] 若 DS = 5000 H,DI = 0200 H 执行结果:BX [50201 H][50200 H] BX = 3220 H 4、以BX、BP和SI、DI寄存器组合起来进行间接寻址——基址加变址的寻址 20H 32H 50200H 50201H [BX] [SI] [BP] [DI] EA = +
例:若 BX = 5000 H,SI =2000 H,DS =4000 H, SS = 1000 H,BP = 3100 H。 MOV AX,[BX+SI]; EA=5000+2000=7000H, AX [47001 H] [47000 H] AX = 2A32 H 相对的基址加变址的寻址: MOV AX,[BP + SI + 0020 H]; EA=3100+2000+0020=5120H
例:设 BX = 0158 H,DI = 10A5 H,DS = 2100 H,位 移量 = 1B57 H,DS 作为操作数的段寄存器。 1)直接寻址: MOV AX,[1B57 H] 有效地址 = 1B57 H 物理地址 = 21000 H+1B57 H = 22B57 H 2)寄存器间接寻址: MOV AX,[BX] 有效地址 = 0158 H 物理地址 = 21000 H + 0158 H = 21158 H 3)BX寄存器相对间接寻址: MOV AX,[BX+1B57H] 有效地址 = 0158 H + 1B57 H = 1CAF H 物理地址 = 21000 H + 1CAF H = 22CAF H 4)变址寻址: MOV AX,[DI]
有效地址 = 105A H 物理地址 = 21000 H+105A H = 220A5 H 5)DI寄存器相对变址寻址: MOV AX,[DI+1B57H] 有效地址 = 105A H + 1B57 H = 2BFC H 物理地址 = 21000 H + 2BFC H = 23BFC H 6)基址加变址的寻址 : MOV AX,[BX + DI] 有效地址 = 0158 H+105A H = 11FD H 物理地址 = 21000 H + 11FD H = 221FD H 7)相对的基址加变址的寻址: MOV AX,[BX + DI+1B57 H] 有效地址 = 0158 H+105A H + 1B57 H = 2D54 H 物理地址 = 21000 H + 2D54 H = 23D54 H
指令 寄存器 内存 指令 寄存器 EA 数据 内存 寄存器 位移量 指令 寄存器 寄存器 + 数据 寄存器 数 据 地址 指令 内存 直接寻址 EA 数 据 寄存器寻址 寄存器间接寻址 寄存器相对寻址
指令 基址寄存器 变址寄存器 位移量 内存 变址值 + 数据 基址值 相对的基址加变址 基址加变址寻址 指令 基址寄存器 变址寄存器 变址值 内存 + 数据 基址值
指令格式 指令执行时间3. 2.1 指令格式8086 的指令为 1 ~ 6字节1、操作码域: 一般用指令的第一个字节或者头两个字节表示指令的操作码和寻址方式——操作码域。 3 - 2 8086 指令系统的概述
单字节指令(隐含的操作数) 单字节指令(寄存器模式) 寄存器到寄存器 不带位移量的寄存器和内存之间的传送 带位移量的寄存器和内存之间的传送(设位移量为 16 位) 立即数送寄存器(设立即数为 16 位) 立即数送内存(设带 16 位位移量) 图 3 - 3 8086 指令格式举例 REG——寄存器 MOD——模式 R/M——寄存器或内存 操作码 操作码 REG 操作码 11 REG R/M 操作码 MOD REG R/M 操作码 MOD REG R/M 位移量低位 位移量高位 操作码 11 REG R/M 数据低位 数据高位 操作码 MOD 操作码 R/M 位移量低位 位移量高位 数据低位 数据高位
操作码:指出执行这条指令时,CPU 要做什么操作。 (OP)一般用指令的一个字节表示,有时 由于用 8 位还不够,常在指令的第二个字节 中还可占有 3 位操作码。 指令的第一字节: w d 立即方式寻址时,操作码中用 S 位表示符号扩展 s=1,将 8 位立即数扩展成 16 位数时 OP d/s w w=1,对字进行操作 w=0,对字节进行操作 d=1,目的操作数 d=1,源操作数
2、操作数域:操作码域后面所跟的字节一般统 称为操作数域。 • 2 字节的有效地址(直接寻址); • 1 字节或者 2 字节的位移量; • 1 字节或者 2 字节的立即数; • 1 字节或者 2 字节的位移量,后面再跟 1 字节 或者 2 字节的立即数; • 2 字节的位移量和 2 字节的段地址(只对段间 接转移而言)。 指令: 单操作数指令 双操作数指令
3.2.2 指令执行时间 指令执行时间:由时钟周期长短和执行指令所需要 的时钟周期数决定。 访问内存操作执行一条指令的时间为基本执行时间 加上计算有效地址所需要的时间。(计算有效地址所需 要时间由寻址方式决定。
表 3 - 4 计算有效地址的时间 寻 址 方 式 计算有效地址所需时钟数 直接寻址 6 寄存器间接寻址 5 相对的寄存器间接寻址 9 基址变址寻址 7 基址变址寻址 8 相对基址变址寻址 11 相对基址变址寻址 12 [ BP + DI ] [ BX + SI ] [ BP + SI ] [ BX + DI ] [BP+DI+位移量] [BX+SI+位移量] [BP+DI+位移量] [BX+SI+位移量]
表 3 - 5 指令执行时间计算举例 指 令 所需的时钟数 访问内存次数 寄存器到寄存器3 0 内存到寄存器 9+EA 1 ADD或SUB 寄存器到内存 16+EA 2 立即数到寄存器 4 0 立即数到内存 17+EA 2 累加器到内存 10 1 内村到累加器 10 1 MOV 寄存器到寄存器2 0 内存到寄存器 8+EA 1 寄存器到内存 9+EA 1 立即数到寄存器 4 0 立即数到内存 10+EA 1 MOV 寄存器到段寄存器 2 0 内存到段寄存器 8+EA 1
段寄存器到寄存器 2 0 段寄存器到内存 9+EA 1 累加器和 8 位寄存器乘 70~77 0 累加器和 16 位寄存器乘 118~133 0 MUL 累加器和内存字节乘 (76~83)+EA 1 累加器和内存字乘 (124~139)+EA 1 累加器和 8 位寄存器乘 80~98 0 累加器和 16 位寄存器乘 128~154 0 IMUL 累加器和内存字节乘 (86~104)+EA 1 累加器和内存字乘 (134~160)+EA 1 除数在 8 位寄存器中 80~90 0 除数在 16 位寄存器中 144~162 0 DIV 除数为 8 位内存字节 (86~96)+EA 1 除数为 16 位内存字 (150~168)+EA 1 除数在 8 位寄存器中 101~112 0 IDIV 除数在 16 位寄存器中 165~184 0
IDIV 除数为 8 位内存字节 (107~118)+EA 1 除数为 16 位内存字 (171~190)+EA 1 在寄存器中移 1 位 2 0 在寄存器中移若干位 8+4*位数 0 循环和移位 内存数据移 1 位 15+EA 2 内存数据移若干位 20+4*位数+EA 2 段内直接转移 15 0 段间直接转移 15 0 JMP 段内间接转移 24+EA 2 段间间接转移 18+EA 1 寄存器模式段间间接转移 11 0 JCXZ 6(不转移) 0 条件转移 18(转移) 0 其他条件转移指令 4(不转移) 0 16(转移) 0
思考题 1、若SS=1000H,BP=2000H,DS=5000H, BX=4000H,说明下列指令的执行结果。 MOV AX,2C10H MOV AX,[2C10H] MOV AX,[BX+1C00H]] MOV BX,[BP+0120H] MOV AX,[BP+ SI] MOV AH,[BX+SI]
数据传送指令 算术运算指令 逻辑运算、移位、循环指令 串操作指令 控制转移指令 处理器控制指令 3-3 8086指令系统
MOV LEA PUSH LDS POP LES XCHG LAHF PUSHF XLAT SAHF POPF IN OUT 3-3-1、数据传送指令
1.通用型 (1).MOV传送指令 格式:MOV dst,src ; dst src 例:MOV DS, AX ;DS AX MOV CH, 20 ;CH 20 MOV BL, AH ;BLAH MOV AX, [BX] ;AX[BX] MOV [DX], AX ;[DX]AX MOV AX, [BX+0060H] (2)堆栈操作指令 PUSH src ;把src推入堆栈 POP src ;把src弹出堆栈
例:设SS=0100 H, SP=0009H,AX=12C3H, BX = 5070 H PUSH AX ;[1] SP SP-2 [2] [41008][41007H] AX 16 SS SP 0100 0009 01006H 01007H 01008H 01009H SP SP - 2(新栈顶) -2 C3 12 SP(原栈顶)
POP AX;将栈顶两单元内容送AX ;SP SP+2 16 SP(原栈顶) SS SP 0100 0007 SP SP+2 (新栈顶) 01006H 01007H 01008H 01009H +2 C3 12C3 12 AX
例 PUSH AX PUSH BX ……. POP BX POP AX 注: 1)8086 的堆栈操作是按字进行的。 2)每执行一条推入堆栈指令,SP 减 2。执行弹出指令时,刚好相反,每弹出 1 个字,SP的值加 2。 3)CS 的值可以推入堆栈,但不能从堆栈中弹出 1个字到CS 寄存器。 4)堆栈中的内容是按后进先出的原则进行传的。
(3) 、交换指令 格式: XCHG dst,src XCHG AX,BX XCHG AL,BH XCHG BX,[1000H] XCHG [2100H],DH XCHG SI,AX 注意:1、dst与src不能同时为内存单元; 2、不能使用CS、IP作为操作数。 例
(4)、换码指令 格式: XLAT (无参数) ;AL[BX+AL] 使累加器中的一个值变换为内存表格中的某一个值。用来实现编码制的转换。要求:BX 寄存器指向表的首地址,AL中为位移量。 BX AL BX+0 BX+1 BX+2 BX+AL +
十进制数 g f e d c b a 0 0 1 0 0 0 0 0 0 40H 1 0 1 1 1 1 0 0 1 79H 2 0 0 1 0 0 1 0 0 24H 3 0 0 1 1 0 0 0 0 30H a f g b e c d
十进制数字0~9转换成七段显示码的译码表, 现在要取 3的对应的七段译码。 MOV AL,3 MOV BX,2000H XLAT 执行XLAT指令后: AL=30H 例 2000h 40 79 24 30 19 12 02 78 00 10
2、目标地址传送指令 (1)取有效地址 LEA reg16,men16 LEA AX,[1000H] ;AX=1000H LEA SP,[0500H] ;SP=0500H LEA,BX,[BP+SI] (2)将地址指针送DS和另一寄存器: LDS reg16,men32 后2个字节送DS,前2个字节送寄存器。 LES reg16,mem32 后2个字节送ES ,前2个字节送寄存器。
LDS DI,[2100H] 2100H 2101H 2102H 2103H 3104H 1C H 20 H 21 H B5 H DI=201CH DS=B521H
3、标志传送 1)、读标志:LAHF ;将标志送AH 置标志:SAHF ;将AH送标志寄存器 SF ZF AF PF CF FLAG D7 D6 D5 D4 D3 D2 D1 D0
(2). PUSHF:把标志推入堆栈。 SP SP-2,FLAGH入栈 (3). POPF :把标志弹出堆栈。 FLAG [SP+1],[SP] SP SP+2
4、输入输出指令 1)、直接寻址 IN AL,n OUT n,AL IN AX,N OUT N,AX 寻址空间为:0 ~ 255 字节 IN AL, 20H IN AX, 30H OUT 46H,AL OUT 80H,AX 例
2)、间接寻址 IN AL,DX OUT DX,AL IN AX,DX OUT DX,AX 寻址空间为:0000H ~ FFFFH MOV DX,1000H IN AL,DX IN AX,DX OUT DX,AL 例
1、只能用累加器作为执行输入/输出过 程的机构。 2、用直接输入/输出指令时,寻址范围 为 1~ 255。 表 3-6 IBM PC 系列机的端口地址 P63 注:
加法:ADD、ADC、INC 减法:SUB、SBB、DEC、DAS 乘法:MUL、IMUL、AAM 除法:DIV、IDIV、AAM AAA、DAA、DAS、AAM、AAM 3-3 数据操作指令3-3-2算术运算指令
1)不带进位位的加法 格式: ADD DST,SRC DST DST+SRC 例:(1) . ADD AL,50H ; AL AL+50H (2). ADD CX,1000H ;CX CX+1000H (3). ADD DI, SI ;DI DI+SI (4). ADD [BX+DI],AX BX=1000H, DI=2000H, AX=1234H EA=BX+DI=3000H 1234+ 4025H =5259H [3000H] 5259H 一、加法指令
2).带进位位的加法 格式:ADC DST,SRC DST DST+SRC+CF 例: ADC AX,SI ; AX AX+SI+CF ADC DX,[SI] DX DX+[SI]+CF ADC BX,3000H BX BX+3000H+CF ADC AL,5 AL AL+5+CF
例:有两个4字节无符号数放在2000H和3000H单元中,低位在前,高位在后,将两个数相加,结果放2000H开始的单元中。例:有两个4字节无符号数放在2000H和3000H单元中,低位在前,高位在后,将两个数相加,结果放2000H开始的单元中。 10008432H+20007F00H = ? 1).算法分析: 1).可以将两个4字节无符号数相加 看成2个字相加; 2).两个数的低位字相加后,将可能 产生进位CF; 3).高位字相加,应再加上进位位; 2000H 3000H 32 84 00 10 00 7F 00 20 SI DI
2).程序: CLC ;清进位 MOV SI , 2000H ;取第一个数的首地址 MOV AX, [SI] ;第一个数的低16位送到AX MOV DI , 3000H ;取第二个字的首地址 ADD AX , [DI] ;第一个数和第二个数相加 MOV [SI], AX ;送低16位结果倒2000H单元 MOV AX, [SI+2] ; 第二个数的高16位送AX ADC AX , [DI+2] ;高16位数据相加 MOV [SI+2],AX
3).加一指令 格式:INC src ; src src+1 将操作数内容加一,再回送操作数。 INC AX ;AX AX+1 INC BL ;BL BL+1 INC BYTE PTR[BX+DI+500] 注意:INC指令影响标志AF、OF、PF、SF、ZF, 但不影响进位标志CF。
(1)不带借位的减法 格式:SUB DST,SRC DST DST-SRC 例: SUB BX,CX ;BXBX-CX SUB [BP+2],CL ;[BP+2] [BP+2]-CL SUB AL,20 ;AL AL-20 SUB SI,5010H ;SI SI-5010H SUB WORD PTR [DI],1000H ;[DI+1][DI] [DI+1][DI]-1000H 二、减法指令