Upload
agalia
View
74
Download
0
Embed Size (px)
DESCRIPTION
在此幻灯片插入公司的徽标 从“插入”菜单 选择图片 找到徽标文件 单击“确定” 重新设置徽标大小 单击徽标内任意位置。徽标外部出现的方框是“调整控点” 使用这些重新设置对象大小 如果在使用尺寸调整控点前按下 shift 键,则对象改变大小但维持原比例。. 微机原理. 制作者: 张幸. 第三章 8086寻址和指令系统. 8086指令系统具有灵活的指令格式、很强 的寻址能力、能处理多种数据类型 本章讨论8086寻址能力 ,指令系统. 第一节 8086寻址方式. 一、基本概念 二、指令寻址方式. 一、基本概念. 1. 指令 机器指令 - PowerPoint PPT Presentation
Citation preview
微机原理
制作者: 张幸
第三章 8086 寻址和指令系统8086 指令系统具有灵活的指令格式、很强的寻址能力、能处理多种数据类型本章讨论 8086 寻址能力 ,指令系统
第一节 8086 寻址方式
一、基本概念二、指令寻址方式
一、基本概念
1. 指令 机器指令
以二进制代码(机器码)表示指令直接,不易读懂
汇编指令以符号形式表示指令易读,需要翻译(汇编)
2. 指令成分 操作码:操作的性质
表示指令应完成的具体操作以助记符的形式表示
操作数:操作的对象
3. 指令操作数 双操作数
OPR DEST , SRC 单操作数
OPR DEST 无操作数
OPR (隐含操作数)
二、指令寻址方式
寻址方式: CPU 寻找操作数或送操作结果的方式。
操作数就在指令中操作数在 CPU 的 Register 中操作数在 Memory 中
操作数可能存放的场所
8086 的寻址方法有:立即寻址、存储器寻址、串操作寻址I/O 端口寻址、程序转移寻址
1. 立即寻址:指令中直接给出操作数的数值。如: MOV AL , 26H MOV CX , 2A50H立即寻址速度快,一般用于给寄存器或存储器赋初值
2. 寄存器寻址:操作数存放在指令规定的寄存器中。 如: MOV DX , AX
寄存器寻址机器码字节最短,执行速度最快
3. 直接寻址:指令直接给出操作数的偏移地址。(存储器寻址方式) 直接寻址方式: MOV AX , [2000H] 段超越前缀: MOV AX , ES : [500] 符号地址: AREA1 DW 100
MOV AX , AREA1
4. 寄存器间接寻址:操作数的有效地址 EA
存放在基址或变址寄存器。
MOV AX , [SI] (DS):(SI)→AXMOV AX , [BP] (SS):(BP)→AX
(BX) (SI) 段寄存器 DS ( 即操作数在数据段 )
(DI) (BP) 段寄存器 SS ( 即操作数在堆栈段 )
EA =
5. 寄存器相对寻址:操作数的有效地址 EA
是8 位或 16 位的偏移量加基址或变址寄存器
如: MOV BX , COUNT[SI]
(BX) (SI) 段寄存器 DS( 即操作数在数据段 )
(DI) (BP) 段寄存器 SS ( 即操作数在堆
栈段 )
EA =+disp
+disp
注:偏移量可以是负数
6. 基址变址寻址:操作数的有效地址 EA 是基址存器( BX 或 BP )加变址寄存器( SI 或 DI )。
( BX ) ( SI ) ( BP ) ( DI )
+BX 默认段 DS
BP 默认段 SS
如: MOV AX , [BX][SI]
MOV AX , [BX+SI]
EA=
7. 相对基址变址寻址:操作数的有效地址 EA 是 8
位或 16 位的偏移量加基址寄存器( BX 或 BP )和变址寄存器( SI 或 DI )。
如: MOV AX , MASK[BX][SI]
MOV AX , [MASK+BX+SI]
( BX ) ( SI ) 8 位偏移量 ( BP ) ( DI ) 16 为偏移量
+BX 默认段 DS
BP 默认段 SS+EA=
其它: 隐含寻址 I/O 端口寻址 一条指令几种寻址方式 转移类寻址
8.I/O 端口寻址 直接端口寻址:指令中直接给出外设端口地址 如: IN AL , 63H OUT 64H , AL 间接端口寻址:指令 DX 寄存器为外设端口地址 如: MOV DX , 213H IN AL , DX注: 直接端口寻址范围( 0~FFH ) 间接端口寻址范围( 0~FFFFH )
转移指令寻址方式 段内直接寻址 立即短转移 JMP SHORT PROG_S (8 位
立即数 ) 立即近转移 JMP NEAR PTR PRON_N ( 16
位立即数) 段内间接寻址 以存储器或寄存器作为转移目标
地址 寄存器: JMP BX 存储器: JMP WORD PTR [BX] 段间直接寻址 JMP FAR PTR PROG
_F 段间间接寻址 JMP DWORD PTR[BX]
第二节 8086 指令系统 指令系统是汇编语言程序设计基础 汇编语言不如高级语言容易掌握 学习要点:功能、寻址方式、对 PSW 影响 8086 指令系统分 6 类:数据传送、算术
运算、逻辑和移位、字符串处理、转移类指令、处理机控制类。
一、数据传送指令
1 、通用传送指令指令名称 操作码 操作数 例
传送字或字节 MOV 目标,源 MOV ARRAY[SI] , AL把字压入堆栈 PUSH 源 PUSH AX
把字弹出堆栈 POP 目标 POP AX
交换字节或字 XCHG 目标,源 XCHG AX , BX
字节翻译 XLAT 译码表 XLAT ASCII-TAB
MOV 指令完成把 1 字节或 1 字内容从源操作数
传送到目的操作数•立即数不能做目的操作数•无存储器间直接传送•不能给 CS 、 IP 直接赋值•不能用立即数对段寄存器赋值
立即数
存储
器
段寄存器
通用寄
存器
格式: MOV 目标,源
例: MOV AL ‘, B’
MOV DX , OFFSET ARRAY MOV AL , AREA1 MOV AREA2 , AL
AREA1
AREA2
ARRAY
143B
00
00
00
00
PUSH 进栈指令
若 BX=2500H
DS=2130H
SP=0040H
SS=2000H
执行 PUSH BX
PUSH DS
2000 : 0000
30 21 00 25
2000 : 0040
栈底
减1SP
•源操作数可以是通用寄存器、段寄存器、存储器。•压栈时必须是字•先压高字节、再压低字节,且 SP 减 1
格式: PUSH 源
执行后 SP=003CH
POP 出栈指令若: SP=003CH
SS=2000H
执行 POP DS
POP BX
•目的操作数可以是通用寄存器、段寄存器、存储器。•弹栈时必须是字•先弹低字节、再弹高字节,且 SP 加 1
2000 : 0000
30 21 00 25
2000 : 0040
栈底
加1SP
2000 : 003C
执行后 SP=0040HDS=2130HBX=2500H
格式: POP 目的
XCHG 交换指令 格式: XCHG 目的,源 例: XCHG AX , [BX+200H]
若: AX=2000H , DS=3000H BX=1800H ,( 31A00H ) =1995H 。 执行后: AX=1995H ( 31A00H ) =2000H
注:源、目的可以是寄存器,可以是存储器,但不能都是存储器
XLAT 指令 格式: XLAT 或 XLAT 表该指令采用隐含寻址表有效地址 EA=BX+AL ,查表后内容送 AL 例:把 0~9 的十进制数转换成七段码
TABLE DB 40H , 79H , 24H , 30H , 19H DB 12H , 02H , 78H , 00H , 18H MOV AL , 5 MOV BX , OFFSET TABLE XLAT TABLE
2 、输入 / 输出指令 IN 累加器,端口 OUT 端口,累加器如果端口地址在 0000H~00FFH ,可用直接或间接寻址如果端口地址不在 0000H~00FFH ,只能用间接寻址
IN AX , 21H (直接)MOV DX , 210H (间接)IN AL , DX
IN AL , 210H ()
名称 操作码 操作数 举例 装入有效地址 LEA 目,源 LEA BX , [DI]指针装入 DS LDS 目,源 LDS BX , TABLE[SI]指针装入 ES LES 目,源 LES DI , ARRAY[BX]
例: 若: DI=0100H , DS=2000H ,
( 20106H ) =1234H ,( 20108H ) =5678H
则: LEA BX , 6[DI] BX=0106H
LDS BX , 6[DI] BX=1234H DS=5678H
3 、地址目标传送指令
这三条指令用于传送地址码,源操作数必须是存储器,
目的操作数除段寄存器的 16 位寄存器。
4 、标志传送指令LAHF 标志装入 AH
将标志 SF , ZF , AF , PF , CF 送 AH 的 7 , 6 , 4 , 2 ,0
SAHF AH 内容装入标志 将 AH 的 7 , 6 , 4 , 2 , 0 送标志 SF , ZF , AF , PF , CF
PUSHF 压标志POPF 弹标志
传送指令对标志影响: 除 POPF SAHF 两条指令,其余指令均不
影 响标志
二、算术运算指令 8086 算术运算指令共有 20 条,分 4 组 8086 的 4 组指令为加法、减法、乘法、除法 8086 可处理四种类型的数:无符号、带符号、
压缩 BCD 码、非压缩 BCD 码8086 四种类型数的解释 二进制 十六进制 无符号数 带符号数 非压缩 BCD 压缩 BCD 00000111 07 7 7 7 7 10001001 89 137 -119 无效 89 11000101 C5 197 -59 无效 无效
1 、加法指令 ADD 目的,源 目的源 + 目的 ADC 目的,源 目的源 + 目的 +CF INC 目的 目的目的 +1 AAA DAA
说明:源操作数为立即数、通用寄存器、存储器 目的操作数为通用寄存器、存储器 源、目不能都是存储器 算术运算指令影响标志
例: ADD AL , 18H ADC BL , AL ADC AX , DX ADD AL , COST[BX] INC BL INC CX INC BYTE PTR[BX] INC WORD PTR[BX]
DAA 加法的十进制调整指令,适用压缩 BCD 码调整原则: 若 AL 低 4 位 >9 或 AF=1 则 ALAL+6 ,进行低字节调整 若 AL 高 4 位 >9 或 CF=1 则 ALAL+60H ,进行高字节调整,使 CF=1例 1 、 AL=38 ( BCD ) BL=15 ( BCD ),求两数之和 ADD AL , BL ; AL=4BH DAA ; AL=53H ( BCD ) CF 0例 2 、 AL=88 ( BCD ) BL=49 ( BCD ),求两数之和 ADD AL , BL ; AL=0D1H DAA ; AL=37H , CF=1
使用 AAA 、 DAA 指令注意:仅对 AL 调整,运算必须是字节,且结果存在 AL
中参加运算的数必须合法,即压缩或非压缩 BCD 码紧跟在 ADD 、 ADC 、 INC 指令后面
2 、减法指令 SUB 目的,源 目的目的 - 源 SBB 目的,源 目的目的 - 源 -CF DEC 目的 目的目的 -1 NEG 目的 目的 0- 目的 CMP 目的,源 源 - 目的 AAS DAS
说明:源操作数为立即数、通用寄存器、存储器 目的 通用寄存器、存储器 源、目不能都是存储器 算术运算指令影响标志
3 、乘法指令
说明: * 乘法指令只给出一个源操作数,另一源操作数, 目的操作数采用隐含寻址 * 乘法指令可字节与字节乘,可字与字乘 字节乘 : AX AL* 源 字乘: DX AX AX* 源 * 源操作数可选寄存器、存储器(说明字还是字节) * 乘法影响标志 CF , OF
采用字节乘还是字乘取决于原操作数
MUL 源IMUL 源AAM
例 1 : MUL DL MUL CX MUL BYTE PTR[SI] MUL WORD PTR[BX]
例 2 : AL=55H , BL=14H MUL BL 执行后 AX=06A4H CF=1 , OF=1
例 3 : AL=-28H , BL=59H IMUL BL 执行后AX=F98CH , CF=1 , OF=1
乘法的 ASCII 调整:AAM 把 AL/10商在 AH ,余数在 AL例: MOV AL , 09H MOV BL , 06H MUL BL ; AL=36H AAM ; AH=05H , AL=04H
4 、除法指令 CBW
CWD
说明: * 除法指令只给出一个源操作数,另一源操作数, 目的操作数采用隐含寻址 * 除法可完成字节或字除,取决于源操作数 * 字节除 商 AL ,余数 AH AX/ 源(字节) 字除 商 AX ,余数 DX DXAX/ 源(字) * 源操作数可选寄存器、存储器(说明字还是字节) * 除法指令对标志无影响,但超过范围,产生中断
DIV 源 IDIV 源 AAD
例 1 :完成两个无符号数 7A86H , 04H相除 MOV AX , 7A86H MOV BL , 04H DIV BL 超过范围,产生除法中断
AL=-12AH=-2
AL=-13AH=1OR ?
MOV DX , 0MOV AX , 7A86HMOV BX , 04HDIV BX
例 2 : -38/3 的商和余数 MOV AX , -38 MOV CH , 03H IDIV CH
MOV AL , -38MOV CH , 03HCBWIDIV CH
符号扩展:CBW AL 符号扩展 AXCWD AX 符号扩展 DX , AX
除法的 ASCII 调整:AAD ALAH*10+AL , AH 0在做除法前先除例:完成非压缩 BCD 码 37 除 5 MOV AX , 0307H
MOV BL , 05H AAD ; AL=25H DIV BL ; AL=7 (商) AH=2 (余数)
三、逻辑运算与移位指令
1 、逻辑运算指令 名称 操作码 操作数 功能 非 NOT 目的 目的 目的 与 AND 目的,源 目的 目的源 或 OR 目的,源 目的 目的源异或 XOR 目的,源 目的 目的源测试 TEST 目的,源 目的源
与指令用来清除或保留操作数中某些位 或指令用来保留或使操作数某些位置 1 异或指令可使某些位取反,某些位不变 测试指令完成的功能是与,但不回送结果 逻辑运算指令对标志影响: NOT 指令不影响标志,其余指令根据结果置 SF , ZF , PF 、 CF 与 OF 清 0 、 AF 不确定。
2 、移位与循环指令 逻辑左移 SHL 目的,计数值 算术左移 SAL 目的,计数值 逻辑右移 SHR 目的,计数值 算术右移 SAR 目的,计数值 循环左移 ROL 目的,计数值 循环右移 ROR 目的,计数值 带进位循环左移 RCL 目的,计数值 带进位循环右移 RCR 目的,计数值
SHL/SAL SHRSARROLRORRCLRCR
0
0M
M
M
CF
CF
CF
CF
CF
CF
CF
L
L
L
移位:
循环指令用于按位检测,又能恢复原值场所 8086循环和移位指令一次可移 1 位,也可移多位
( CL ) 操作数形式:
对标志影响:AF 无定义、 PF , SF , ZF根据结果定、 OF 移一位,根据结果定;移多位,不确定
目的操作数 可选用存储器、寄存器计数值 选 1 或 CL
逻辑左移 无符号乘 2 逻辑右移 无符号除 2算术左移 带符号乘 2 算术右移 带符号除 2
例 2 : MOV AL , 10000000B MOV CL , 03H SAR AL , CL ; AL=F0H=-16
例 1 : MOV AL , 10000101B MOV CL , 03H ;右移三位 = 除 8 SHR AL , CL ; AL=10H=16
用移位指令和循环指令可完成多精度数移位例 1 :完成 AX , BX左移一位
SHL BX , 1 RCL AX , 1
例 2 : 完成 AX , BX 右移一位(无符号数)
SHR AX , 1RCR BX , 1
四、字符串处理指令 传送字节串或字串 字节串或字串比较 字节串或字串扫描 取字节串或字串 存字节串或字串
MOVS 目的,源MOVSB/MOVSW
CMPS 目的,源CMPSB/CMPSW
SCAS 目的 SCASB/SCASW
LODS 源 LODSB/LODSWSTOS 目的 STOSB/STOSW
字符串指令有五种:传送、比较、扫描、取和存 字符串指令采用隐含寻址,指令中用到寄存器和标志 寄存器 /标志 用途 SI 源字符串的偏移量 DI 目的字符串的偏移量 CX 重复计数器
AL/AX
DF
ZF
SCAS 作为扫描值 LODS 作为目的操作数 STOS 作为源操作数=0 SI , DI自动增量 CLD =1 SI , DI自动减量 STD 扫描 /比较结束符
传送指令:从源区目的区 DS:(SI) ES:(DI)
字节 SI1 SI DI1 DI字 SI2 SI DI2 DI
串比较: 源串和目的串比较 DS:(SI) - ES:(DI)相等 1 ZF , 不相等 0ZF
字节 SI1 SI DI1 DI字 SI2 SI DI2 DI
串扫描 : 用于扫描某个关键字
字节 AL-ES:(DI) DI1DI 相等 1 ZF , 不相等 0ZF字 AX-ES:(DI) DI2DI 相等 1 ZF , 不相等 0ZF
存入串指令 : 把累加器内容存入指定附加段 字节 ALES:(DI) DI1DI
字 AXES:(DI) DI2DI
取串指令: 把数据段内容送累加器
字节 DS:(SI) AL SI1SI 字 DS:(SI) AX SI2SI
重复 REP 重复,直至 CX=0 等于 /为零重复 REPE/REPZ ZF=1重复串操作,直至 CX=0 不等 /不为零重复 REPNE/REPNZ ZF=0重复串操作,直至 CX=0
MOVSB
MOV A,[SI]MOV ES:[DI],ALINC SIINC DI
REP
DEC CXJNZ XX
XX:
例 1 :要求把程序段以 SRC-MESS 为偏移地址的字符串‘ HELLO’ 传送到附加段以NEW-LOC 的单元中。
DATA SEGMENT
SRC_MESS DB ‘HELLO’
DATA ENDS
EDATA SEGMENT
NEW_LOC ?,?,?,?,?
EDATA ENDS
CODE SEGMENTASSUME CS:CODE,DS:DTAT,ES:EDATA
MOV AH,4CH INT 21HCODE ENDS
MOV AX,DATAMOV DS,AXMOV AX,EDATAMOV ES,AXMOV SI,OFFSET SRC_MESS
MOV DI,OFFSET NEW_LOC
MOV CX,5
例 2 :比较两个字符串,首址分别为 PASSWORD ,IN-WORD 若输入字符串相同,程序开始运行,否则,程序驱动扬声器发声
DATA SEGMENT
PASSWORD DB ‘750430LI’
IN-WORD DB ‘750424LE’
COUNT EQU 8
DATA ENDS
CODE SEGMENT ASSUME DS : DATA , ES : DATA … … LEA SI , PASSWORD LEA DI , IN-WORD MOV CX , COUNT CLD REPZ CMPSB JNE SOUND OK … … : SOUND :… … CODE ENDS
在某一字符串中搜寻是否有字符 A ,若有,则把搜索次数记下来,送 BX 寄存器。若没有查到,则将 BX 的内容清 0 ,设字符串起始地址为 0 MOV DI , OFFSET STRING MOV CX , COUNT MOV AL ‘, A’ CLD REPNE SCASB JZ FIND MOV DI , 0FIND : MOV BX , DI
初始化,保证指令正确执行
搜索字符
条件判断
五、控制转移类指令 控制转移类指令用于控制程序的走向 8086 的控制转移指令有无条件转移、条件转移、长转移、短转移。
8086 的转移指令有 28 条,分 4 组
1 、条件转移指令
1 )直接标志转移( 10 条)
JC rel CF=1 JNC rel CF=0 JZ/JE rel ZF=1 JNZ/JNE rel ZF=0 JS rel SF=1 JNS rel SF=0 JO rel OF=1 JNO rel OF=0 JP/JPE rel PF=1 奇 JNP/JPO rel PF=0 偶
条件判断?
满足
PC+2+rel->pc Pc+2->pc
不满足
求 AL , BL 两数之和、若有进位,则 AH 置
1 ,否则 AH 清 0 ADD AL , BL JC NEXT MOV AH , 0 JMP EXITNEXT : MOV AH , 1EXIT :
2 )间接标志转移 (8 条 ) 无符号数
JA/JNBE rel CF ZF=0 高于 / 不低于等于 JAE/JNB rel CF=0 高于等于 / 不低于 JB/JNAE rel CF=1 低于 / 不高于等于 JBE/JNA rel CF ZF=1 低于等于 / 不高于
带符号数JG/JNLE rel (SF OF) ZF=0 大于 / 不小于等于 JGE/JNL rel SF OF=0 大于等于 / 不小于 JL/JNGE rel SF OF=1 小于 / 不大于等于 JLE/JNG rel (SF OF ) ZF=1 小于等于 /不大于
设某个学生的英语成绩已在 AL 寄存器 ,若低于 60 分 ,则打印
F(FAIL), 若高于或等于 85,则打印 G(GOOD),当 60 分和 84
分之间 , 打印 P(PASS)
CMP AL,60 JB FAIL CMP AL,85 JAE GOOD MOV AL,’P’ JMP PRINT MOV AL,’F’ JMP PRINT MOV AL,’G’
FAIL:
GOOD: PRINT:
在以首址为 TABLE 的 10 个内存字节单元中存放10 个带符号数 ,要求统计正数、负数和零的个数,并把结果存放在 PLUS 、 NEGT 、 ZERO单元DB
01H , 80H , 0F5H , 32H , 86H DB 74H , 49H , 0AFH , 25H , 40H DB 0 DB 0 DB 0 MOV CX,10 MOV BX,0 CMP TABLE[BX],0 JGE GRET_EQ INC NEGT JMP NEXT JG P_INC INC ZERO JMP NEXT
PLUS NEGT ZERO
AGAIN:
GRET_EQ:
INC PLUS INC BX DEC CX JNZ AGAIN
P_INC: NEXT:
TABLE
2 、无条件转移和过程调用1 ) JMP 无条件转移 段内直接寻址 立即短转移 JMP SHORT PROG_S (8 位立即数 ) 立即近转移 JMP NEAR PTR PRON_N ( 16 位立即数) 段内间接寻址 以存储器或寄存器作为转移目标地址 寄存器: JMP BX
存储器: JMP WORD PTR [BX] 段间直接寻址 JMP FAR PTR PROG _F 段间间接寻址 JMP DWORD PTR[BX]
2 )过程调用和返回指令 调用: CALL 过程名 返回: RET RET N
3 )循环控制指令 LOOP rel CX CX-1 ;( CX )‡ 0 循环 LOOPZ/LOOPE rel CX CX-1 ; (CX)‡ 0ZF=1 循环
LOOPNZ/LOOPNE rel CX CX-1 ; (CX)‡ 0ZF=0 循环
JCXZ rel (CX)=0循环
例 1:设商店有 8 种商品 ,它们的价格分别为 83元 ,76元 ,65元 ,84元 ,71元 ,49元 ,62元 ,58元 ,现将每
种价格提价 7元。
DB 83H,76H,65H,84H DB 71H,49H,62H,58H DB 8 DUP (?)
MOV CX,08H MOV BX,00 MOV AL,OLD[BX] ADD AL,7 DAA MOV NEW[BX],AL INC BX LOOP NEXT
OLD
NEW
NEXT:
例 2:设有一个 50 字节组成的数组存放在 ARRAY开始
的内存单元 ,现要对该数组元素进行测试 ,查找第一
个非零元素。DB XX , XX …,
MOV BX , OFFSET ARRAY DEC BX MOV CX , 50 INC BX CMP [BX] , 00 LOOPE NEXT
ARRAY
NEXT :
例 3 :设一个由 17 个字符组成的字符串存放在STRING开始的内存,现要查找该字符串中是否包含空格符。若没有查到或尚未查完,则继续找,直到找到第一个空格符或查完为止。
DB ‘Personal Computer’
MOV BX,OFFSET STRING DEC BX MOV CX,17 INC BX CMP [BX],20H LOOPNZ NEXT
NEXT:
STRING
4) 中断指令 INT N INTO IRET
修改标志 CLC CF0 CMC CFCF STC CF1 CLD DF0 STD DF1 CLI IF 0 STI IF 1
六、处理器控制指令
8086 与外部事件同步 HLT 停机 WAIT 等待 ESC 交权 LOCK 封锁
空操作 NOP 空操作