微机原理及应用第4章(3)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.4 8086/8088指令系统
• Intel 8086指令系统共有133条基本指令,可 分成以下 6 类:
① 数据传送类指令 ② 算术运算类指令 ③ 位操作类指令 ④ 串操作类指令 ⑤ 控制转移类指令 ⑥ 处理机控制类指令
1
4.4.1 数据传送类指令
• 最基本、最重要、最常用的一类操作。 • 可实现下列数据传送功能
29
例:将字节数据80H送到3fcH端口
mov dx,3fch mov al,80h out dx,al
30
练习、判断对错,并说明原因:
• • • • • • • • • •
(1) MOV (2) MOV (3) MOV (4) MOV (5) MOV (6) MOV (7) MOV (8) XCHG (9) XCHG (10) OUT
xchg ax,[2000h]
xchg al,[2000h]
xchg bx,[bp+14h]
• 不能在存储单元之间直接交换 • 立即数或段寄存器不Leabharlann Baidu作为操作数
12
4. 换码指令XLAT(translate)
执行过程: ① BX+AL; 例 : MOV BX,offset TABLE ② 用DS为段基址,BX+AL为偏移量获得 MOV AL,3H ; 20位物理地址; (AL)=9 XLAT BX ③ 把该单元的内容传送至AL。 M …………… TABLE 0 1 TABLE: DB 0 +3 4 DB 1 9 DB 4 16 25 DB 9
7
2、堆栈操作
• “先进后出FILO”存取的存储区域,只有一 个数据出入口,即当前栈顶(不断变化) • 两种基本操作
–数据压进堆栈PUSH –数据弹出堆栈操作POP
Word Word Word Word Word 5 4 3 2 1
• SS指向堆栈段的起始位置 • SP指定栈顶
–数据进入堆栈,SP逐渐减小 –数据依次弹出、SP逐渐增大
存储器与寄存器 寄存器与寄存器 累加器与I/O端口 立即数到寄存器或存储器
• 存储器之间不能直接传递数据。
2
• 把数据从一个位置传送到另一个位置
• 14条指令分 5 组
通用数据传送: MOV/XCHG/XLAT
堆栈操作: PUSH/POP LAHF/SAHF/PUSHF/POPF
标志寄存器传送: 地址传送:
DB 16 DB 25
13
• 例:设表首的偏移地址为2000H,要查找表内第4号 单元 (从0号算起)的内容并送回AL,则程序段如下: MOV BX,2000H MOV AL,04H XLAT DS16
TABLE 表格的首地址(一般 为符号地址),在这 (表首)TABLE 里只是为了提高程 序的可读性,并不
23
• 例: LES DI,[BX] 指令执行前:
DS=6000H, BX=0800H (60800H)=0608H,(60802H)=4000H 指令执行后: 0608H DI = ? 4000H ES = ?
24
3、 标志位传送指令
LAHF
;AH←FLAGS的低字节
SAHF
;FLAGS的低字节←AH
1. 有效地址传送指令LEA(load EA) 例:MOV BX,0400H MOV SI,3CH LEA BX,[BX+SI+2000H] ;BX=243CH
18
例:
• 设(DI)=5000H,(ES)=0000H,内存单 元(ES:500AH)=OOFFH,说明下列两 条指令执行后AX的内容。
4000 + 0100 + 2000H = 6100H
22
例:地址指针的传送
mov word ptr [3060h],0100h
mov word ptr [3062h],1450h
Lds si,[3060h] ;ds=1450h,si=0100h Les di,[3060h] ;es=1450h,di=0100h
;AL/AX←I/O端口
OUT i8/DX,AL/AX
;I/O端口← AL/AX
①直接寻址 ② 间接寻址
PORT<=255
DX=0-0FFFFH
28
例:从端口20H和21H输入一个字量数据
解a:用直接寻址字节输入指令 IN AL,21H MOV AH,AL IN AL,20H 解b:用直接寻址字输入指令 IN AX,20H 解c:用DX间接寻址字输入指令 MOV DX,20H IN AX,DX
–展开: IN/OUT
4
指令操作数符号说明
符号 OPRD
OPRD1,OPRD2
意义 操作数
在多操作数指令中,OPRD1为目标操作数,OPRD2源操作数
reg Sreg(Seg)
通用寄存器,长度可以是8位或16位。 段寄存器
reg8
reg16 mem mem8 mem16 imm
8位通用寄存器
16位通用寄存器 存储器,长度可以是8位或16位。 8位存储器 16位存储器 立即数,长度可以是8位或16位。
Hex_table+0 Hex_table+1 Hex_table+2 Hex_table+8 Hex_table+9
;(BX)←表首偏移地址 ;(AL)←8 ;查表转换
30H 31H 32H 38H 39H
‘0’ ‘1’ ‘2’ ‘8’ ‘9’
查表后(AL)= 38H ?
15
例:比较下面两指令的不同
• •
LEA AX,ES:[DI+10] MOV AX,ES:[DI+10]
19
2. 指针传送指令
• (1) 有效地址传送指令
– LEA (Load Effective Address)
• (2) 地址指针传送指令
– ① LDS (Load pointer into DS) – ② LES (Load pointer into ES)
Stack PUSH POP
8
入栈指令PUSH
• 先将SP减小作为当前栈顶 • 然后将源操作数(立即数、通用寄存器和段寄 存器内容或存储器操作数)传送到当前栈顶 • 以字或双字为单位操作 push ax push ebx
Word 1
SP
-2
Stack PUSH
9
出栈指令POP
• 先将栈顶数据传送到目的操作数(通用寄 存器、存储单元或段寄存器) • 然后SP增加作为当前栈顶 • 以字或双字为单位操作
imm8
imm16
8位立即数
16位立即数
5
一、通用数据传送指令 1、传送指令MOV
• 把一个字节、字或双字的操作数从源位置传送至目 的位置
立即数 并非任意传送 ! (P83)
存 储 器
通用 寄存器
段寄存器
• 双操作数必须类型一致 • 操作数必须有明确的类 型 6
常见错误指令
错在哪里? MOV AL,050AH MOV SI,DL MOV [BX],12H ;假设wbuf1和wbuf2是两个字变量 MOV WBUF2,WBUF1 MOV DS,ES 如何改正? MOV DS,100H
2000HBX 18H 34H 05H 06H 09H
AL 参与汇编。 09 04
04HAL
14
例:在内存的数据段中存放有一张数值0~9的ASCII 码转换表,首地址为Hex_table。 现要求:把数值 8 转换成对应的ASCII码。 LEA BX,Hex_table MOV AL,8 XLAT
2、带进位加法指令ADC
• 两个操作数相加,再加CF,结果送目的操作数 • 按照定义影响6个状态标志位 ADC dest,src ;dest←dest+src+CF • 用于与ADD指令相结合实现多精度数的加法
34
例:无符号双字加法运算
编程实现双字DX.AX=0234 4652H与F0F0 F0F0H双字之和,结果存在DX.AX中。
BX= 0023H = 093C3H-093A0H
16
• 例:判断下列指令的正确性
PUSH POP PUSH POP PUSH POP
AH BL CS CS 1234H AL
× × √ × × ×
不能按字节操作 不能按字节操作
不能弹出数据到CS 不能对立即数操作 不能按字节操作
17
二、 目标地址传送指令
pop ax pop ebx
SP
+2
Word 1
Stack POP
10
例:现场的保护和恢复
PUSH AX PUSH BX PUSH DS ... POP DS POP BX POP AX
;进入子程序后
;返回主程序前
11
3. 交换指令XCHG(exchange) 例:
MOV AX,1234H MOV BX,5678H XCHG AX,BX XCHG AH,AL
输入输出:
LEA/LDS/LES
IN/OUT
3
本节要求 • 数据传送是计算机中最基本、最重要的一种操
作。传送类指令也是最常使用的一类指令。
• 除标志寄存器传送指令外,均不影响标志位
–重点掌握: MOV/PUSH/POP –特别熟悉: XCHG/XLAT/LEA –一般了解:
LAHF/SAHF/PUSHF/POPF/LDS/LES
LAHF和SAHF指令仅 影响5个标志位SF、ZF、 AF、PF、CF!
25
3、 标志位传送指令 PUSHF ;SP←SP-2 ;SS:[SP]←FLAGS
PUSHF和POPF指令常用 在子程序或中断处理程序 的首尾,以保存主程序标 志和恢复主程序标志。也 常用来修改TF状态。
POPF ;FLAGS←SS:[SP] ;SP←SP+2
LEA BX,BUFFER
093A0H ………..
数据段
MOV BX,BUFFER 存储单元内容如右图所示。 若:DS=093AH,BUFFER
差23H
093C3H
物理地址 093C3H 则 MOV BX,BUFFER ;
0045H BX= ? LEA BX,BUFFER ;
BUFFER
45H 00H
20
(1) 有效地址传送指令LEA
• 格式 LEA REG, (16位通用Reg) SRC (mem操作数)
• 功能 把源操作数的有效地址EA送到目的操作数中。 • 使用规则
源操作数必须是存储器(mem)操作数;
目的操作数必须是16位通用寄存器; 不影响标志位。
21
• 例 :分析指令运行结果 • (a) LEA AX,[2728H] • (b) LEA BX,[BP+SI] • (c) LEA SP,[0482H] • (d) LEA BX,[BX+DI+2000H] – 指令执行前:BX = 4000H,DI = 0100H – 指令执行后:BX =
– 重点掌握: ADD/ADC/SUB/SBB/INC/DEC/CMP – 一般了解: CBW/CWD – 认真理解: DAA/DAS/AAA/AAS/AAM/AAD
33
标志?
– 比较熟悉: NEG/MUL/IMUL/DIV/IDIV
一、加 法
1、加法指令ADD
• 目的操作数加上源操作数,和送到目的操作数 ADD dest,src ;dest←dest+src • 按照定义影响6个状态标志位
26
例:置位单步标志
pushf pop ax or ah,01h
;保存全部标志到堆栈 ;从堆栈中取出全部标志 ;设置D8=TF=1, ;ah其他位不变 push ax ;将ax压入堆栈 popf ;将堆栈内容取到标志 ;寄存器,即 FLAGS←AX
27
三、输入/输出传送指令
IN AL/AX,i8/DX
AH,BX [SI],[BX] AX,[SI][DI] AX,[BX][BP] BX,ES:[AX] BYTE PTR[BX],1000 CS,AX AL,40H ES,AX 160H,AL
31
4.4.2 算术运算类指令
• 实现二进制/BCD码数据的四则运算
– 1、加法运算: ADD/ADC/INC
– 2、减法运算: SUB/SBB/DEC/NEG/CMP
– 3、乘法运算: MUL/IMUL
– 4、除法运算: DIV/IDIV
– 5、符号扩展: CBW/CWD
– 6、十进制调整:
DAA/DAS/AAA/AAS/AAM/AAD
32
4.4.2节要求
• 四则运算是计算机经常进行的一种操作。 算术运算指令也是经常使用的一类指令。 • 请注意算术运算指令对标志的影响
mov ax,4652h add ax,0f0f0h CF=1 mov dx,0234h adc dx,0f0f0h CF=0
;ax=4652h ;ax=3742h,
;dx=0234h ;dx=f325h,
35
3、增量指令INC(increment)
• 只有一个操作数:寄存器或存储单元 • 对操作数加1(增量)再将结果返回原处 INC reg/mem ; reg/mem←reg/mem+1 • 用于计数器和地址指针的调整 • 不影响进位CF标志,但影响其他状态标志位
• Intel 8086指令系统共有133条基本指令,可 分成以下 6 类:
① 数据传送类指令 ② 算术运算类指令 ③ 位操作类指令 ④ 串操作类指令 ⑤ 控制转移类指令 ⑥ 处理机控制类指令
1
4.4.1 数据传送类指令
• 最基本、最重要、最常用的一类操作。 • 可实现下列数据传送功能
29
例:将字节数据80H送到3fcH端口
mov dx,3fch mov al,80h out dx,al
30
练习、判断对错,并说明原因:
• • • • • • • • • •
(1) MOV (2) MOV (3) MOV (4) MOV (5) MOV (6) MOV (7) MOV (8) XCHG (9) XCHG (10) OUT
xchg ax,[2000h]
xchg al,[2000h]
xchg bx,[bp+14h]
• 不能在存储单元之间直接交换 • 立即数或段寄存器不Leabharlann Baidu作为操作数
12
4. 换码指令XLAT(translate)
执行过程: ① BX+AL; 例 : MOV BX,offset TABLE ② 用DS为段基址,BX+AL为偏移量获得 MOV AL,3H ; 20位物理地址; (AL)=9 XLAT BX ③ 把该单元的内容传送至AL。 M …………… TABLE 0 1 TABLE: DB 0 +3 4 DB 1 9 DB 4 16 25 DB 9
7
2、堆栈操作
• “先进后出FILO”存取的存储区域,只有一 个数据出入口,即当前栈顶(不断变化) • 两种基本操作
–数据压进堆栈PUSH –数据弹出堆栈操作POP
Word Word Word Word Word 5 4 3 2 1
• SS指向堆栈段的起始位置 • SP指定栈顶
–数据进入堆栈,SP逐渐减小 –数据依次弹出、SP逐渐增大
存储器与寄存器 寄存器与寄存器 累加器与I/O端口 立即数到寄存器或存储器
• 存储器之间不能直接传递数据。
2
• 把数据从一个位置传送到另一个位置
• 14条指令分 5 组
通用数据传送: MOV/XCHG/XLAT
堆栈操作: PUSH/POP LAHF/SAHF/PUSHF/POPF
标志寄存器传送: 地址传送:
DB 16 DB 25
13
• 例:设表首的偏移地址为2000H,要查找表内第4号 单元 (从0号算起)的内容并送回AL,则程序段如下: MOV BX,2000H MOV AL,04H XLAT DS16
TABLE 表格的首地址(一般 为符号地址),在这 (表首)TABLE 里只是为了提高程 序的可读性,并不
23
• 例: LES DI,[BX] 指令执行前:
DS=6000H, BX=0800H (60800H)=0608H,(60802H)=4000H 指令执行后: 0608H DI = ? 4000H ES = ?
24
3、 标志位传送指令
LAHF
;AH←FLAGS的低字节
SAHF
;FLAGS的低字节←AH
1. 有效地址传送指令LEA(load EA) 例:MOV BX,0400H MOV SI,3CH LEA BX,[BX+SI+2000H] ;BX=243CH
18
例:
• 设(DI)=5000H,(ES)=0000H,内存单 元(ES:500AH)=OOFFH,说明下列两 条指令执行后AX的内容。
4000 + 0100 + 2000H = 6100H
22
例:地址指针的传送
mov word ptr [3060h],0100h
mov word ptr [3062h],1450h
Lds si,[3060h] ;ds=1450h,si=0100h Les di,[3060h] ;es=1450h,di=0100h
;AL/AX←I/O端口
OUT i8/DX,AL/AX
;I/O端口← AL/AX
①直接寻址 ② 间接寻址
PORT<=255
DX=0-0FFFFH
28
例:从端口20H和21H输入一个字量数据
解a:用直接寻址字节输入指令 IN AL,21H MOV AH,AL IN AL,20H 解b:用直接寻址字输入指令 IN AX,20H 解c:用DX间接寻址字输入指令 MOV DX,20H IN AX,DX
–展开: IN/OUT
4
指令操作数符号说明
符号 OPRD
OPRD1,OPRD2
意义 操作数
在多操作数指令中,OPRD1为目标操作数,OPRD2源操作数
reg Sreg(Seg)
通用寄存器,长度可以是8位或16位。 段寄存器
reg8
reg16 mem mem8 mem16 imm
8位通用寄存器
16位通用寄存器 存储器,长度可以是8位或16位。 8位存储器 16位存储器 立即数,长度可以是8位或16位。
Hex_table+0 Hex_table+1 Hex_table+2 Hex_table+8 Hex_table+9
;(BX)←表首偏移地址 ;(AL)←8 ;查表转换
30H 31H 32H 38H 39H
‘0’ ‘1’ ‘2’ ‘8’ ‘9’
查表后(AL)= 38H ?
15
例:比较下面两指令的不同
• •
LEA AX,ES:[DI+10] MOV AX,ES:[DI+10]
19
2. 指针传送指令
• (1) 有效地址传送指令
– LEA (Load Effective Address)
• (2) 地址指针传送指令
– ① LDS (Load pointer into DS) – ② LES (Load pointer into ES)
Stack PUSH POP
8
入栈指令PUSH
• 先将SP减小作为当前栈顶 • 然后将源操作数(立即数、通用寄存器和段寄 存器内容或存储器操作数)传送到当前栈顶 • 以字或双字为单位操作 push ax push ebx
Word 1
SP
-2
Stack PUSH
9
出栈指令POP
• 先将栈顶数据传送到目的操作数(通用寄 存器、存储单元或段寄存器) • 然后SP增加作为当前栈顶 • 以字或双字为单位操作
imm8
imm16
8位立即数
16位立即数
5
一、通用数据传送指令 1、传送指令MOV
• 把一个字节、字或双字的操作数从源位置传送至目 的位置
立即数 并非任意传送 ! (P83)
存 储 器
通用 寄存器
段寄存器
• 双操作数必须类型一致 • 操作数必须有明确的类 型 6
常见错误指令
错在哪里? MOV AL,050AH MOV SI,DL MOV [BX],12H ;假设wbuf1和wbuf2是两个字变量 MOV WBUF2,WBUF1 MOV DS,ES 如何改正? MOV DS,100H
2000HBX 18H 34H 05H 06H 09H
AL 参与汇编。 09 04
04HAL
14
例:在内存的数据段中存放有一张数值0~9的ASCII 码转换表,首地址为Hex_table。 现要求:把数值 8 转换成对应的ASCII码。 LEA BX,Hex_table MOV AL,8 XLAT
2、带进位加法指令ADC
• 两个操作数相加,再加CF,结果送目的操作数 • 按照定义影响6个状态标志位 ADC dest,src ;dest←dest+src+CF • 用于与ADD指令相结合实现多精度数的加法
34
例:无符号双字加法运算
编程实现双字DX.AX=0234 4652H与F0F0 F0F0H双字之和,结果存在DX.AX中。
BX= 0023H = 093C3H-093A0H
16
• 例:判断下列指令的正确性
PUSH POP PUSH POP PUSH POP
AH BL CS CS 1234H AL
× × √ × × ×
不能按字节操作 不能按字节操作
不能弹出数据到CS 不能对立即数操作 不能按字节操作
17
二、 目标地址传送指令
pop ax pop ebx
SP
+2
Word 1
Stack POP
10
例:现场的保护和恢复
PUSH AX PUSH BX PUSH DS ... POP DS POP BX POP AX
;进入子程序后
;返回主程序前
11
3. 交换指令XCHG(exchange) 例:
MOV AX,1234H MOV BX,5678H XCHG AX,BX XCHG AH,AL
输入输出:
LEA/LDS/LES
IN/OUT
3
本节要求 • 数据传送是计算机中最基本、最重要的一种操
作。传送类指令也是最常使用的一类指令。
• 除标志寄存器传送指令外,均不影响标志位
–重点掌握: MOV/PUSH/POP –特别熟悉: XCHG/XLAT/LEA –一般了解:
LAHF/SAHF/PUSHF/POPF/LDS/LES
LAHF和SAHF指令仅 影响5个标志位SF、ZF、 AF、PF、CF!
25
3、 标志位传送指令 PUSHF ;SP←SP-2 ;SS:[SP]←FLAGS
PUSHF和POPF指令常用 在子程序或中断处理程序 的首尾,以保存主程序标 志和恢复主程序标志。也 常用来修改TF状态。
POPF ;FLAGS←SS:[SP] ;SP←SP+2
LEA BX,BUFFER
093A0H ………..
数据段
MOV BX,BUFFER 存储单元内容如右图所示。 若:DS=093AH,BUFFER
差23H
093C3H
物理地址 093C3H 则 MOV BX,BUFFER ;
0045H BX= ? LEA BX,BUFFER ;
BUFFER
45H 00H
20
(1) 有效地址传送指令LEA
• 格式 LEA REG, (16位通用Reg) SRC (mem操作数)
• 功能 把源操作数的有效地址EA送到目的操作数中。 • 使用规则
源操作数必须是存储器(mem)操作数;
目的操作数必须是16位通用寄存器; 不影响标志位。
21
• 例 :分析指令运行结果 • (a) LEA AX,[2728H] • (b) LEA BX,[BP+SI] • (c) LEA SP,[0482H] • (d) LEA BX,[BX+DI+2000H] – 指令执行前:BX = 4000H,DI = 0100H – 指令执行后:BX =
– 重点掌握: ADD/ADC/SUB/SBB/INC/DEC/CMP – 一般了解: CBW/CWD – 认真理解: DAA/DAS/AAA/AAS/AAM/AAD
33
标志?
– 比较熟悉: NEG/MUL/IMUL/DIV/IDIV
一、加 法
1、加法指令ADD
• 目的操作数加上源操作数,和送到目的操作数 ADD dest,src ;dest←dest+src • 按照定义影响6个状态标志位
26
例:置位单步标志
pushf pop ax or ah,01h
;保存全部标志到堆栈 ;从堆栈中取出全部标志 ;设置D8=TF=1, ;ah其他位不变 push ax ;将ax压入堆栈 popf ;将堆栈内容取到标志 ;寄存器,即 FLAGS←AX
27
三、输入/输出传送指令
IN AL/AX,i8/DX
AH,BX [SI],[BX] AX,[SI][DI] AX,[BX][BP] BX,ES:[AX] BYTE PTR[BX],1000 CS,AX AL,40H ES,AX 160H,AL
31
4.4.2 算术运算类指令
• 实现二进制/BCD码数据的四则运算
– 1、加法运算: ADD/ADC/INC
– 2、减法运算: SUB/SBB/DEC/NEG/CMP
– 3、乘法运算: MUL/IMUL
– 4、除法运算: DIV/IDIV
– 5、符号扩展: CBW/CWD
– 6、十进制调整:
DAA/DAS/AAA/AAS/AAM/AAD
32
4.4.2节要求
• 四则运算是计算机经常进行的一种操作。 算术运算指令也是经常使用的一类指令。 • 请注意算术运算指令对标志的影响
mov ax,4652h add ax,0f0f0h CF=1 mov dx,0234h adc dx,0f0f0h CF=0
;ax=4652h ;ax=3742h,
;dx=0234h ;dx=f325h,
35
3、增量指令INC(increment)
• 只有一个操作数:寄存器或存储单元 • 对操作数加1(增量)再将结果返回原处 INC reg/mem ; reg/mem←reg/mem+1 • 用于计数器和地址指针的调整 • 不影响进位CF标志,但影响其他状态标志位