770 likes | 976 Views
第三章 8086 寻址和指令系统. 学习要点 1 、 8086 的寻址方式 2 、 8086 的指令系统. 指令. 机器指令 以二进制代码(机器码)表示指令 直接,不易读懂 汇编指令 以符号形式表示指令 易读,需要翻译(汇编) 与 CPU 相关. 指令成分. 操作码:操作的性质 表示指令应完成的具体操作 以助记符的形式表示 操作数:操作的对象 表示指令的操作对象(参与操作的对象) 源操作数、目的操作数. 指令操作数. 双操作数 OPR DEST , SRC 单操作数 OPR DEST 无操作数 OPR (隐含操作数). 操作数就在指令中.
E N D
第三章 8086寻址和指令系统 学习要点 1、8086的寻址方式 2、8086的指令系统
指令 • 机器指令 以二进制代码(机器码)表示指令 直接,不易读懂 • 汇编指令 以符号形式表示指令 易读,需要翻译(汇编) • 与CPU相关
指令成分 • 操作码:操作的性质 表示指令应完成的具体操作 以助记符的形式表示 • 操作数:操作的对象 表示指令的操作对象(参与操作的对象) 源操作数、目的操作数
指令操作数 • 双操作数 OPR DEST,SRC • 单操作数 OPR DEST • 无操作数 OPR(隐含操作数)
操作数就在指令中 操作数在CPU的Register中 操作数在Memory中 8086的寻址方式 寻址方式:CPU寻找操作数或送操作结果的方式。 操作数可能存放的场所
MOV数据传送指令 • 其格式为: • MOV 目的操作数,源操作数 • 目的操作数和源操作数可采用不同的寻址方式,但两个操作数的类型必需一致。
指令 操作数 一、立即寻址 操作数就在指令中 MOV SP,0100H 16bit MOV AL,20H 8bit MOV CX,100 0064H;16bit 问题:操作数是16位,还是8位?
指令 寄存器 操作数 二、寄存器寻址 操作数在寄存器中 MOV CL , AH (AH)→CL MOV DS , AX (AX)→DS
指令 EA 内存 操作数 若(DS)=3000H,则结果为 (32000H)→AL,(32001H)→AH 三、直接寻址 操作数在内存中,其段内偏移(有效) 地址EA在指令中 MOV AX,[2000H]
指令 寄存器 EA 内存 操作数 (BX) (SI) 段寄存器DS (即操作数在数据段) (DI) (BP) 段寄存器SS (即操作数在堆栈段) EA= 四、寄存器间接寻址 操作数在内存中,其EA在指令指明的寄存器中 MOV AX,[SI] (DS):(SI)→AX MOV AX,[BP] (SS):(BP)→AX
操作数在内存中,其EA是指令指明的(基址或变址)寄存器操作数在内存中,其EA是指令指明的(基址或变址)寄存器 内容与指令中指出的8bit/16bit带符号位移量之和。 操作数 & EA (BX) (SI)段寄存器DS(即操作数在数据段) (DI) (BP) 段寄存器SS (即操作数在堆栈段) 内存 +disp EA= +disp 五、寄存器相对寻址 指令 基址寄存器 disp 基址 MOV AX,-100 [SI] (SI)+(-100) →AX MOV DX,ALFA [DI] (DI)+ALFA→DX 注:disp可以是一个带符号数,也可是已赋值的变量
操作数在内存中,其EA是指令指明的基址寄存器与操作数在内存中,其EA是指令指明的基址寄存器与 指令 变址寄存器内容之和。 操作数 基址寄存器 变址寄存器 变址值 & EA 内存 基地址 (BX)+ (SI) 段寄存器DS(即操作数在数据段) (BP) + DI) 段寄存器SS(即操作数在堆栈段) EA= 基址 变址 六、基址变址寻址 MOV [BX][S I],DX (DX)→(BX)+(SI)的内存中
指 令 基址寄存器 变址寄存器 disp & 变址值 EA 基地址 内存 操作数 (BX)+ (SI) +disp 段寄存器DS(即操作数在数据段) (BP) + (DI) +disp 段寄存器SS(即操作数在堆栈段) EA= 七、相对基址变址寻址 操作数在内存中,其EA是指令指明的基址与变址寄存器内容与指令中给出的8bit/16bit带符号位移量之和。 MOV AX,24[BX][S I] ((BX)+(SI)+24)→AX
八、I/O端口寻址 • 操作数在外部设备时,使用两种不同寻址方式的I/O指令。 • 1、直接端口寻址方式 • 指令中直接给出端口地址,范围是:0—FFH • 2、采用寄存器间接寻址方式 • 采用DX寄存器进行间址,范围是:0—FFFFH • 3、I/O寻址时的操作寄存器为AL或AX • IN AL , 25H • MOV DX , 3E4H • OUT DX , AL
第三章作业1 • 1,2,3
指令形式: 操作码 目的地址 源操作数或地址 8086的指令系统 六大类指令: 1、数据传送; 2、算术运算; 3、逻辑运算; 4、串操作; 5、控制传送; 6、处理器控制。 要求了解指令的 1、操作码; 2、操作功能; 3、操作对象; 4、操作结果; 5、对PSW标志位的影响;6、后继地址。
数据传送指令 • 数据传送是计算机中最基本、最重要的一种操作 • 除标志寄存器传送指令和POP指令外,均不影响标志位
1、通用传送指令 MOV OPRD1,OPRD2 把一个byte/word操作数从源传送到目的。对标志位不 起作用。 OPRD1 OPRD2 Im 立即数 a a AL/AX seg seg 段寄存器 r r 通用寄存器 dst src 内存
MOV指令传送功能图解 通用寄存器 AX、BX、CX、 DX、BP、SP、 SI、DI 段寄存器 CS、DS、SS、ES 立即数 Memory
2、堆栈操作指令 PUSH OPRDOPRD→(SP)-1/(SP)-2 (SP) -2→SPPOP OPRD((SP)+1) /(SP)→OPRD (SP)+2→SP r seg src(push) / dst(pop) • PUSH DX • POP BX
3、交换指令 XCHGOPRD1,OPRD2 a r register memory register register XCHG AL,CL / XCHG AX,DI XCHG BX,DATA [SI] XCHG BX,DI • 操作数不能为立即数;段寄存器不能作为操作数。
4、查表转换指令 XLAT 指定表首地址→BX;表元素号→AL 查表结果((BX)+(AL)) →AL 例:若十进制数字0~9 的 LED七段显示码对照表已存放在内存中,表格的首地址为TABLE,用 XLAT 指令求数字5的七段显示码值程序如下: TABLE DB 40H, 79H, 24H, 30H, 19H DB 12H, 02H, 78H, 00H, 18H ; 建立七段显示码表格 OFFSET是运算符 AL 5 MOV AL,5 ; MOV BX,OFFSET TABLE ; BX 表格首地址 XLAT ; AL 12H
5、地址-目的传送指令 ⑴16bit地址-目的传送指令(段内有效偏移地址) 把源操作数的段内有效偏移地址16bit传送到目的地址。 LEAOPRD1,OPRD2 r srt (memory的EA) LEA SI,AREA1 把变量名为AREA1的内存(16bit)地址→SI =MOV SI,OFFSET AREA1 OFFSET是运算符
LDS SI,[BX] 若(DS)=C000H (BX)=080AH 内存数据如表所示; 则指令执行结果 (SI) =0180H, (DS)=2000H 80H 01H 00H 20H C080AH C080CH ⑵32bit地址-目的传送指令(段地址和段内有效偏移地址) 把源操作数的段地址16bit和段内有效偏移地址16bit传送到目的地址。 LDSOPRD1,OPRD2 LESOPRD1,OPRD2 r srt DS,BP/SI/DI ES, BP/SI/DI 段地址,EA
6、标志寄存器传送 LAHF (FLAG/L8bit)→AH SAHF(AH)→FLAG/L8bit PUSFFLAG/16bit 入栈保护 POPF堆栈弹出→FLAG/16bit
0000 0111 1000 1001 1100 0101 07 89 C5 7 137 197 +7 -119 -59 二进制码 (B) 十六进制 (H) 无符号二 进制(D) 带符号二 进制(D) 非压缩 BCD 压缩 BCD 8086可处理四种类型的数:无符号、带符号、压缩BCD码、非压缩BCD码 二进制数可以是8位或16位;若是带符号数则用补码表示。 非压缩BCD在一个字节的低4位存放一个BCD码十进制数,高4位为全0。 压缩BCD数在一个字节中存放二个BCD码十进制数。 7 无效 无效 07 89 无效
INCOPRDOPRD+1→OPRD rCF、OF、PF、SF、ZF src 1、加法指令 ADDOPRD1,OPRD2 OPRD1+OPRD2→OPRD1 ADCOPRD1,OPRD2 OPRD1+OPRD2+CF→OPRD1 影响的标志 CF、OF、PF、SF、ZF ACC im r r dst src
0 9 0 5 (AL)=0 EH (AX)=0 1 0 4H AAA调整 AAA非压缩十进制加法BCD调整(8bit) CF、OF、PF、SF、ZF 8bit(0×)加法后,AL中的非压缩BCD码→AH(0+拾位)AL(0+个位)。 例: MOV BL,09H ;非压缩BCD码 MOV AL,05H ; ADD AL,BL AAA ;(AX)=0104H
38 15 (AL)=4DH (AL)=53H DAA调整 DAA压缩十进制加法BCD调整(8bit) CF、OF、PF、SF、ZF 8bit(××)加法后,AL中的压缩BCD码→AL(拾位、个位)中。若调整结果>99,则CF=1。 例:MOV BL,38H MOV AL,15H ADD AL,BL DAA ;(AL)=53H CF=0
2、减法指令 SUBOPRD1,OPRD2OPRD1-OPRD2→OPRD1 SBBOPRD1,OPRD2OPRD1-OPRD2-CF→OPRD1 ACC imCF、OF、PF、SF、ZF r r dst src DECOPRDOPRD-1→OPRD r CF、 OF、PF、SF、ZF src
03 08 (AL)=FBH (AL)=05H CF=1 AAS调整 AAS未压缩十进制数减法BCD调整(8bit) CF、OF、PF、SF、ZF 8bit(0×) 减法后,AL中的非压缩BCD码→AL(0×个位)中。若有借位,CF=1。 例: MOV CL,08H MOV AL,03H SUB AL,CL AAS ;(AL)=05H,CF=1(有借位)
56 98 (AL)=0BEH (AL)=58H CF=1 DAS调整 DAS压缩十进制数减法BCD调整(8bit) CF、OF、PF、SF、ZF 8bit(××) 减法后,AL中的压缩BCD码→AL(×拾位、×个位)中。 例: MOV CL,98H MOV AL,56H SUB AL,CL DAS ;(AL)=58H,CF=1 (有借位)
CMP OPRD1,OPRD2比较 OPRD1-OPRD2→OPRD1 CF、OF、PF、SF、ZF ACC im r r dst src 在使用(AAA、DAA)和(AAS、DAS)时: 仅对AL调整,运算必须是字节; 必须紧跟在加法或减法指令后面 NEGOPRD取负0-OPRD(取补) →OPRD r / Memory 注意CMP和SUB区别
3、乘法指令 MULOPRD无符号数乘 IMULOPRD带符号数乘 r / Memory 8bit: (AL)×OPRD→AX 16bit:(AX)×OPRD→DX:AX CF、OF、PF、SF、ZF 4、除法指令 DIVOPRD无符号数除 IDIV OPRD带符号数除 r / Memory 8bit:(AX)÷OPRD→AH(余)AL(商) 16bit:(DX:AX)÷OPRD→AX(商)、DX(余) CF、OF、PF、SF、ZF
CBW把AL字节转换为AX字 CF、OF、PF、SF、ZF 若(AL)7=0,则(AH)=00H 若(AL)7=1,则(AH)=FFH CWD把AX节转换为DX:AX双字 CF、OF、PF、SF、ZF 若(AX)15=0,则(DX)=00H 若(AX)15=1,则(DX)=FFH 扩展指令
第三章作业2 • 6,7,9
NOTOPRD OPRD取反→OPRD r / MamoryCF、OF、PF、SF、ZF 逻辑运算指令的运算特点:按bit运算 ANDOPRD1,OPRD2 OROPRD1,OPRD2 XOROPRD1,OPRD2 a im r r dst src PF、SF、ZF CF=OF= 0
TESTOPRD , imOPRD ∧ im → OPRD r / Memory 用于判断OPRD中某一位的情况,如判断“ 正数、负数、奇数、偶数…” PF、SF、ZF OF=CF=0 TEST AL,01H JNZ THERE 若(AL)为奇数,转THERE语句 ;若为偶数,继续执行下一语句。 TEST CX,0FFFFH JZ THERE 若(CX)=0,转THERE语句。
CF OPRD 0 0 0 CF、OF、PF、SF、ZF 2、算术逻辑移位指令 SHLOPRD,m逻辑左移 SALOPRD,m算术左移 SHROPRD,m逻辑右移 SAROPRD,m算术右移 r / Memory 1 / CL 移位次数
CF OPRD CF、OF、PF、SF、ZF 3、循环移位指令 ROLOPRD,m ROROPRD,m RCLOPRD,m RCROPRD,m r / Memory 1 / CL 移位次数
例:(AX)= 0012H,(BX)= 0034H,把它们装配成(AX)= 1234H MOV CL, 8 ROL AX, CL ADD AX, BX 例:(BX) = 84F0H (1) (BX) 为无符号数,求(BX) / 2 SHR BX, 1; (BX) = 4278H (2) (BX) 为带符号数,求(BX) ×2 SAL BX, 1; (BX) = 09E0H, OF=1 (3) (BX) 为带符号数,求(BX) / 4 MOV CL, 2 SAR BX, CL ; (BX) = 0E13CH
AX DX CF 0 例:将DX.AX中32位数值左移一位 shl ax,1 ;AX左移1位,最低位补0,最高位进入CF rcl dx,1 ;带进位循环左移1位
串操作指令 串操作指令:用一条指令实现对一串字符或一串数据的操作。 串操作指令的共同特点: ⑴、可以对字节(8bit)串操作,也可对字(16bit)串操作; ⑵、所有串操作指令都是 SI用于对源操作数间址,段地址为DS(源操作数物理地址在数据段)。源操作数的的地址为DS:SI。 DI用于对目的操作数间址,段地址为ES(目的操作数物理地址在附加段)。目的操作数的地址为ES:DI。 ⑶、待操作的字符串长度(字节或字)放在CX中。 ⑷、串操作时,地址的自动修改取决于方向标志DF DF=1,SI、DI自动减修改;字节操作减1,字操作减2。 DF=0,SI、DI自动增修改;字节操作加1,字操作加2。 ⑸、可以在串操作前加重复前缀完成多次串操作。
1、串传送指令 MOVSB字节操作 ((SI))→(DI);(SI)+/-1→SI;(DI)+/-1→DI MOVSW字操作 ((SI))→(DI);(SI)+/-2→SI;(DI)+/-2→DI CF、OF、PF、SF、ZF 2、串比较指令 CMPSB字节操作 ((SI))-((DI)) →PSW; (SI)+/-1→SI;(DI)+/-1→DI CMPSW字操作 ((SI)+1):((SI))-((DI)+1):((DI)) →PSW; (SI)+/-2 →SI;(DI) +/-2 →DI CF、OF、PF、SF、ZF