2.95k likes | 3.25k Views
微机原理与接口技术 第 3 章 8086/8088 指令系统. 黄强 深圳大学 信息工程学院. 本章内容位于 书本 P49—P77 , P82—P114. 第3章 指令系统与汇编语言 本章主要教学内容 1、8086 指令系统的寻址方式、指令 格式及应用 2、 汇编语言基本格式、程序设计步骤和方法 3、 顺序、分支、循环、子程序的基本结构和设计方法 4、DOS 和 BIOS 中断调用 本章教学目的 使学生掌握指令系统及其应用,学会程序设计的方法。 教学重点: 指令系统的应用、汇编语言程序设计
E N D
微机原理与接口技术第3章 8086/8088指令系统 黄强深圳大学 信息工程学院
第3章 指令系统与汇编语言 • 本章主要教学内容 • 1、8086指令系统的寻址方式、指令格式及应用 • 2、汇编语言基本格式、程序设计步骤和方法 • 3、顺序、分支、循环、子程序的基本结构和设计方法 • 4、DOS和BIOS中断调用 • 本章教学目的 • 使学生掌握指令系统及其应用,学会程序设计的方法。 • 教学重点:指令系统的应用、汇编语言程序设计 • 教学难点:指令的寻址方式、程序设计技巧
第3章 指令系统与汇编语言 • 3.1 寻址方式 • 3.2 8086指令系统 • 3.3汇编语言简述 • 3.4汇编语言程序设计 • 3.5 DOS和BIOS中断调用
第一节 8086/8088的寻址方式 一、内容: 8086/8088的寻址方式 二、作业:2-1, 2-2, 2-3 , 2-4 , 2-5 三、复习内容:P33-P37, P76-P77 四、予习内容:P52-P80
8086/8088的寻址方式讲课内容 一、指令系统概念和指令组成 二、8086/8088寻址方式 三、与转移地址有关的寻址方式 四、小结
一、指令系统概念和指令组成 1、指令系统概念 计算机通过执行指令序列来解决问题, 每种计算机都有一组指令集提供用户使用, 这组指令集就称为计算机的指令系统。 2、指令组成 计算机中指令由操作码字段和操作数字段两部分组成。 一条可以由1~7个字节组成。 操作码字段-----―指示计算机要执行的操作, 操作数字段-----―指出在指令执行操作过程中所需要的操作数; 可以是操作数本身; 可以是操作数地址或是地址的一部分; 可以是指向操作数地址的指针 或其他有关 操作数的信息。
3、指令的一般格式: 操作码字段: 在机器里只需对某种操作指定确定的二进制代码。 通常用指令的第一个字节表示,不够可以占第二个字节中的3位。 操作数字段: 操作数字段可以有一个,二个或三个地址指令。 例: INC CX ADD AX , BX
4、操作数的存放 操作数的存放不外乎三种情况: (1)操作数包含在指令中 即指令的操作数字段包含操作数本身。这种操作数为立即数。 例:MOV AL , 08H (2)操作数包含在CPU的一个内部寄存器中 例:INC CX 指令中的操作数字段是CPU内部寄存器的一个编码。 这种寻址方式称为寄存器寻址。
(3)操作数在内存数据区 操作数在内存数据区,操作数字段包含着此操作数地址。 在8088中,任何内存地址是由两部分组成: 段的基地址:单元所在段的基地址 (大部分情况是数据段寄存器DS中); 段内偏移量:此单元与段基地址的距离。 有效地址EA(Effective Address) : 段内偏移量为适应各种数据结构的需要,可以有几个部分组成,所以也把它称为有效地址EA。
寻址方式不同EA的构成不同。 归纳EA可有多种情况构成: 直接寻址,寄存器间接寻址,寄存器相对寻址, 基址加变址寻址,相对基址加变址寻址。 寻址方式——如何寻找内存操作数。 不同寻址方式实质上是构成它段内的偏移量的方法不同。
二、8086、8088寻址方式 (一)立即寻址 (Immediate addressing) (二)寄存器寻址方式 (Register addressing) (三)直接寻址 (Direct addressing) (四)寄存器间接寻址方式(Register indirect addressing) (五)寄存器相对寻址方式(Register relative addressing) 或变址寻址(Index Addressing) (六)基址加变址寻址方式(Based indexed addressing) (七)相对基址加变址寻址方式(Relative based indexed addressing)
(一)立即寻址(Immediate addressing) 操作数直接存放在指令中,紧跟在操作码之后,作为指令 的一部分,存放在代码段里,这种操作数称为立即数。 立即数可以是8位或16位的。 16位的立即数是高位字节放在高地址,低位字节放在低地址。 使用场合:经常用于给寄存器赋初值。 注意:只能用于源操作数字段,不能用于目的操作数字段。
例: MOV AL,05H 指令执行后: (AL)=05H 例: MOV AX,3064H 指令执行后: (AX)=3064H 立即寻址方式
(二)、 寄存器寻址方式 (Register addressing) 操作数在寄存器中,指令指定寄存器号。 对于16位操作数,寄存器可以是: AX,BX,CX,DX,SI,DI,SP,BP。 以及段寄存器。 对于8位操作数,寄存器可以是: AL,AH,BL,BH,CL,CH,DL,DH。 这种寻址方式因为操作数在寄存器中 不需要访问存储器的运算速度较高。
例: 指令执行前:(AX)=3064H (SS)=1234H MOV SS,AX 指令执行后: (SS)=3064H (AX)保持不变。 指令执行前: 指令执行后: 寄存器寻址方式
(三)直接寻址(Direct addressing) 操作数地址的16位偏移量,直接包含在指令中, 存放在代码段中指令操作码之后, 但操作数一般存放在数据段中, 必须先求出操作数的物理地址, 然后再访问存储器才能取得操作数。 或(10H) 物理地址 : PA=16d×(DS)+EA IBMPC机允许数据存放在数据段以外的其它段中。此时应在指令中指定段跨越(可以是CS,SS,ES)。
例:MOV AX,[3100H] (DS)=6000H , (63100H)=3050H 则:(AX)=3050H 又如:用符号地址代替数值地址。 MOV AX,VALUE 或 MOV AX,[VALUE] VALUE——有效操作数单元的 符号地址。 如:VALUE在附加段中, 则应指定段跨越。 MOV AX,ES:VALUE 或MOV AX,ES:[VALUE] 直接寻址方式
注意: (1)直接寻址方式适用于处理单个变量。 (2)直接寻址方式隐含的段寄存器是 DS, 8086/8088允许段跨越,即允许使用 CS SS ES作为段寄存器,这时,必须在指令中特别标明。 (3)IBM PC机中规定双操作数指令必须有一个操作数使用寄存器方式,这就是常常先要把一个变量送到寄存器去的原因。 例: 要处理某存放在存储器里的变量,可以用直接寻址方式把变量先取到一个寄存器中再作处理。
(四) 寄存器间接寻址方式(Register indirect addressing) 操作数在存储器中, 操作数地址的16位偏移量包含在: BP、BX、SI、DI寄存器中。 1、若选择SI、DI、BX作为间接寻址 操作数一般在现行数据段区域中,用(DS)作为段地址。 即操作数物理地址为: 物理地址PA=16 d ×(DS)+(BX) 物理地址PA=16 d × (DS)+(SI) 物理地址PA=16 d × (DS)+(DI)
例:MOV BX,[DI] (DS)=6000H (DI)=2000H PA=62000H (62000H)=50A0H (BX)=50A0H 寄存器间接寻址方式 MOV BX,[DI]
2 、若选择BP寄存器作为间接寻址 操作数在堆栈段区域中,用SS寄存器的内容作为段地址。 操作数物理地址: PA=16d × (SS)+(BP) 例: MOV [BP], AX 执行前: (SS)=1000H , (BP)=3000H , (AX)=1234H 执行后:PA=13000H (13000H)=1234H 寄存器间接寻址方式 MOV [BP], AX
3 、用 SI、DI、BX 、BP作为间接寻址允许段跨越 指令中可以指定段跨越前缀来取得其他段中的数据。 例:MOV ES:[DI], AX MOV DX, DS:[BP] 这种寻址方法可以用于表格处理。
(五) 寄存器相对寻址方式(Register relative addressing) 或变址寻址 (Index Addressing) 操作数的有效地址是一个基址或变址寄存器的内容 和指令中指定的8位或16位位移量(displacement)之和。
8086/8088 CPU 中有两个变址寄存器: 源变址寄存器 SI ; 目的变址寄存器DI。 操作数一般在内存的数据段中,但允许段跨越。 除有段跨越前缀之外,形成物理地址有二种方式:
例: MOV AX, COUNT [BP] 或MOV AX, [COUNT+BP] 或MOV AX, COUNT+[BP] COUNT为16位位移量。 指令执行前: (SS)=5000H, (BP)=3000H, COUNT=2040H, (AX)=1234H 指令执行后:EA=5040H PA=55040H (55040H)=5548H (AX)=5548H 寄存器相对寻址方式 MOV AX,COUNT[BP]
用途:这种寻址方式同样用于表格处理。 表格首地址COUNT 修改基址或变址寄存器来取得表格中的值。 例:某数据表的首地址为COUNT 欲读取表中第10个数据,存放到(AL)中。 第10个数据的有效地址: EA= COUNT + 9 MOV SI , 09H MOV AL , [SI+COUNT] * 直接变址寻址方式也可以使用段跨越前缀 MOV DL,ES:STRING[SI]
(六) 基址加变址寻址方式 (Based indexed addressing) 操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,基址寄存器名和变址寄存器名均有指令指定。
除有段跨越前缀之外,形成物理地址有二种方式:除有段跨越前缀之外,形成物理地址有二种方式:
例: MOV AX, [BX][SI] 或 MOV AX, [BX+SI] 执行指令前: (DS)=3200H, (BX)=0456H, (SI) =1094H (334EAH)=4567H 执行指令后: EA=14EAH PA=334EAH (AX)=4567H 基址加变址寻址方式 MOV AX,[BX+SI]
用途:这种寻址方式同样适用于数组或表格处理。用途:这种寻址方式同样适用于数组或表格处理。 表格首地址 基址寄存器中, 用变址寄存器来访问数组中的元素。 二个寄存器都能修改, 所以比直接变址方式更灵。 这种寻址方式允许段跨越。 使用段跨越前缀格式: MOV AX,ES:[BX][SI]
(七)相对基址加变址寻址方式 (Relative based indexed addressing) 操作数有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之和 。
除有段跨越前缀之外,形成物理地址有二种方式:除有段跨越前缀之外,形成物理地址有二种方式:
例: MOV AX, MASK[BX][DI] MOV AX, MASK [BX+DI] MOV AX,[MASX+BX+DI] 执行指令前: (DS)=3000H (BX)=1346H (DI)=0500H MASK=1234H (32A7AH)=4050H 执行指令后: EA=2A7AH PA=32A7AH (AX)=4050H 相对基址加变址 MOV AX, MASK+[BX+DI]
用途: 这种寻址方式为堆栈处理提供方便: (BP) 栈顶(一般 BP 可指向栈顶) 从栈顶到数组的首地址可以用位移量表示(MASK). 变址寄存器(SI)或(DI)——指向数组中某个元素。
三、与转移地址有关的寻址方式 段内转移只需改变 (IP) 段内转移包括两种寻址方式:直接 ,间接。 段间转移改变(CS)(IP) 段间转移包括两种寻址方式: 直接 ,间接。 功能: 用来确定转移指令及CALL指令的转移地址。 以转移指令为对象来分析各种转移地址寻址方式。
(一)段内直接寻址(Intrasegment direct addressing) (二)段内间接寻址(Intrasegment indirect addressing) (三)段间直接寻址(Intersegment direct addressing) (四)段间间接寻址:(Intersegment inderect addressing)
(一)段内直接寻址(Intrasegment direct addressing) 转向有效地址EA是(IP)当前和指令中指定的8位或16位位移量之和。 相对寻址方式含义: EA(即转向的有效地址) 用相对于(IP)当前值的位移量表示。 位移量:位移量=转向有效地址-(IP)当前值之差。 对于近转,16位位移量可正可负,一般范围是-32768~+32767 对于短转,8位位移量可正可负, 范围是 -128~+127, 这种寻址方式适用于条件转移及无条转移指令。 当用于条件转移指令时,位移量只允许 8 位; 用于无条件转移指令时,位移量 8 位时称为 短跳转。
指令汇编语言格式: JMP NEAR PTR PROGIA;(IP)←(IP)当前+16位位移量 JMP SHORT QUEST; (IP)←(IP)当前+8位位移量 调用指令(CALL)也适用。 PROGIA 均为转向符号地址,机器中用 位移量表示。 QUEST 汇编指令中16位位移量,则在符号地址前加操作符 NEAR PTR。 8位位移量 : 前引用标号(标号后定义 ),则在符号地址前加操作符SHORT。 后引用标号(标号先定义 ),则在符号地址前不必加操作符 SHORT。
JMP NEAR PTR PROGIA; (IP)←(IP)当前+16位位移量 段内直接寻址 JMP NEAR PTR PROGIA
(二)段内间接寻址(Intrasegment indirect addressing) 段内间接寻址: 转向有效地址是一个寄存器或一个存储单元的内容, 这内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得。得到的转向有效地址用来取代IP寄存器的内容。 这种寻址方式和以下二种段间寻址方式都不能用于条件转移指令。 * 条件转移指令只能适用段内直接寻址的8位位移量。
汇编格式:JMP BX JMP WORD PTR [BP + TABLE] 其中: WORD PTR——操作符, (BP)+TABLE 寻址所得地址是一个字的有效地址, 由有效地址形成物理地址里的内容即为转向有效地址IP。 转向物理地址的计算公式:PA=16d(CS)+(IP)
段内间接寻址方式的转移指令中转移的有效地址的计算方法:段内间接寻址方式的转移指令中转移的有效地址的计算方法: 举例: 指令执行前: 设:(DS)=2000H,(BX)=1256H,(SI)=528FH, TABLE=20A1H, (232F7H)=3280H,(264E5H)=2450H 例1、JMP BX 指令执行后: (IP)=1256H
例2、JMP WORD PTR TABLE[BX] 指令执行后: PA= 16d(DS)+(BX)+TABLE = 232F7H (IP) = 3280H=(232F7H) 例3、JMP WORD PTR [BX][SI] 指令执行后: PA= 16d (DS)+(BX)+(SI)= 264E5H (IP) = 2450H=( 264E5H) 注意:如果指令操作数已被定义为16位的存储器,则: WORD PTR 可以省去。
(三)段间直接寻址:(Intersegment direct addressing)指令中直接提供了转向段地址和偏移地址。 用指令中指定的偏移地址 (IP)用指令中指定的段地址 (CS)完成了从一段到另一段的转移操作 指令汇编语言格式: JMP FAR PTR NEXTROUTINT NEXTROUTINT —— 转向的符号地址FAR PTR —— 段间转移操作符 OFFSET NEXTROUTINT (IP) SEG NEXTROUTINT (CS)
(四)段间间接寻址 (Intersegment inderect addressing) 用存储器中二个相继字的内容取代IP、CS以达到段间转移目的。 存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种寻址方式取得。 指令汇编语言格式: JMP DWORD PTR [INTERS+BX] DWORD PTR——双字操作符,转向地址双字(段间转移) [INTERS+BX]——数据寻址方式为直接变址寻址方式 * 段间转移必须是无条件转移。
例:JMP DWORD PTR [BX] 指令执行前: 设: (DS)=4000H, (BX)=1212H (41212H)=1000H (41214H) =4A00H 指令执行后: (IP)=1000H (CS)=4A00H
四、小结 1、三种类型操作数 2、三种类型操作数特点 3、8088中的存储器分段
1、三种类型操作数 • 综观8086/ 8088寻址方式,其操作数有三种类型: • 立即操作数、寄存器操作数、存储器操作数。 • 2、三种类型操作数特点: • (1)立即操作数 • 可以使用立即操作数指令有: • 数据传送指令、算术运算指令(乘、除运算指令除外)、 • 逻辑运算指令等。 • 立即数只能作为源操作数,不能作为目标操作数。