1.74k likes | 1.96k Views
吉林大学工学部计算机硬件基础课程 微机原理与接口技术. 侯彦利. 侯彦利. 吉林大学工学部计算机硬件基础课程 微机原理与接口技术. 侯彦利. 3.1 概述. 3.2 8086 指令系统的寻址方式. 3.3 指令系统. 第 3 章 8088/8086 指令系统. 学习目的与要求
E N D
吉林大学工学部计算机硬件基础课程微机原理与接口技术吉林大学工学部计算机硬件基础课程微机原理与接口技术 侯彦利 侯彦利
吉林大学工学部计算机硬件基础课程微机原理与接口技术吉林大学工学部计算机硬件基础课程微机原理与接口技术 侯彦利
3.1 概述 3.2 8086指令系统的寻址方式 3.3 指令系统 第3章 8088/8086指令系统 • 学习目的与要求 • 熟练掌握8086/8088 CPU的功能结构以及内存储器的分段组织,对于学习汇编语言程序设计至关重要,甚至对全课程的学习都有很大的帮助。汇编语言虽然已不作为应用软件开发的主要编程语言,但用它编写的程序能够充分发挥硬件系统的特性,时空效率高,在I/O接口、操作系统内核、实时控制系统的开发以及程序调试、加密解密等方面具有其他高级语言无法替代的作用。通过本章的学习和上机操作,要求理解8086/8088寻址方式与常用指令、熟悉汇编语言的基本指令。
3.1.1 机器语言与汇编语言 • 机器语言由二进制代码组成。 • 机器语言中的每一条称为指令,计算机能够识别的所有指令的集合称为指令系统。 • 指令是计算机能够执行的最小功能单位。 • 机器语言程序就是由一条条的指令按一定顺序组织起来的指令序列。 • 计算机的CPU不同,指令系统也不同。
一条指令一般由操作码和操作数两部分组成。操作码详细地说明指令要执行的操作,操作数是指令执行时需要的数据。 • 汇编语言是一种符号语言。用汇编语言编制的程序称为汇编语言源程序,计算机不能直接识别执行,必须翻译成机器语言程序。翻译的过程称为汇编,完成汇编工作的程序称为汇编程序。汇编程序属于系统程序,是汇编语言的命令处理程序。 • 计算机的CPU不同,汇编语言也不同。本章以8086CPU为主,介绍常用的汇编语言指令格式、寻址方式和用法。
3.1.2 指令的基本构成 • 指令的一般格式 • 一条指令包含操作码和操作数两部分 。 1~6字节 操作码 目的操作数 源操作数 1~2字节
操作数可以有一个也可以有两个,还可以没有。操作数可以有一个也可以有两个,还可以没有。 • 只有一个操作数的指令常称为单操作数指令, • 有两个操作数的指令常称为双操作数指令。 • 形式上无操作数的指令,通常操作数是隐含的。 • 操作数有源操作数和目的操作数之分。 • 操作数的长度与指令的寻址方式有关 。
2. 操作数类型 • 8086CPU指令的操作数有三种类型:立即数、寄存器操作数和存储器操作数。 • 立即数操作数又称为常数,可以是数值型常数也可以是字符型常数。数值型常数可以是字节或字,可以是无符号数或有符号数。立即数在指令中只能作为源操作数,不能作为目的操作数。
寄存器操作数,8086CPU含有的8个16位的通用数据寄存器和4个段寄存器作为16位寄存器操作数,还有8个8位寄存器操作数。控制寄存器IP、Flags只在特定指令中作为操作数。寄存器操作数,8086CPU含有的8个16位的通用数据寄存器和4个段寄存器作为16位寄存器操作数,还有8个8位寄存器操作数。控制寄存器IP、Flags只在特定指令中作为操作数。 寄存器操作数在指令中可以作为源操作数也可以作为目的操作数,段寄存器CS除外,它只能作为源操作数 。 个别指令将FLAGS作为操作数。
AH AL AX BH BL BX CX CH CL 通用寄存器 DH DL DX 堆栈指针寄存器 SP BP 基址指针寄存器 源变址寄存器 SI 目的变址寄存器 DI • CS DS SS ES IP FLAGS 通用寄存器中AX、BX、CX、DX、SI、DI、BP、SP存放字操作数; AH、AL、BH、BL、CH、CL、DH、DL存放字节操作数;
存储器操作数:用内存单元中的数据作为操作数。存储器操作数:用内存单元中的数据作为操作数。 • 通常用内存单元地址表明。存储器操作数既可以作为源操作数也可以作为目的操作数,但多数指令要求源和目的操作数不能同时为存储器操作数。 • 指令中的操作数如果是存储器操作数,通常指令指明存储单元的地址或用某种方式指明存储单元的地址。 操作数可以是1个字节或2个字节(字)甚至4个字节(双字)。
6E 53 20000H 20001H 20002H 20003H 01010011 01101110 10010110 11000011 图3-2 数据存放 • 数据在内存中以“高高低低”的原则存放,低字节存于低地址内存中,高字节存于高地址内存中。存储器操作数如果是多字节,指令中指明的存储单元地址通常是它的低地址或称为首地址。 • 如寄存器AX的内容为6E53H,将它存入20000H中:
3. 指令的书写格式 • 标号: 操作码助记符 目的操作数,源操作数 ;注释 • GOON: MOV AX, BX ;数据传送
标号是字母数字组合的符号,代表指令,是指令的地址——用符号表示的地址。标号后跟冒号“:”作为间隔符。标号一般由字母开头的字母数字组成,长度不超过31个字符。不允许使用汇编语言中的保留字作标号。标号是字母数字组合的符号,代表指令,是指令的地址——用符号表示的地址。标号后跟冒号“:”作为间隔符。标号一般由字母开头的字母数字组成,长度不超过31个字符。不允许使用汇编语言中的保留字作标号。 • 操作码助记符与操作数助记符之间至少应有一个空格作为间隔符。如果指令有两个操作数,操作数之间以逗号“,”作为间隔符。 • 操作数助记符与注释之间用分号“;”作为间隔符。可以跟在指令的后面也可以单独一行,若注释超过一行,则新行以分号“;”开头。 • 指令中的标点符号应为ACSII字符。
3.2 8086CPU寻址方式 • 寻址方式,即获得地址的方法,主要指获得段内偏移地址的方法,段基址常采用默认方式获得。8086CPU指令系统的寻址方式有两类: (1)获得指令中操作数地址的方法 • 立即数操作数作为指令的一部分出现在指令中,随着CPU取指令的动作进入CPU内,不需要再寻址; • 寄存器操作数本就在CPU内部,寄存器的符号就是地址; • 存储器操作数在内存中,指令只能给出内存单元的偏移地址,而且这个地址常常并不是指令需要的操作数有效地址,要通过某种计算方法才能得到操作数的最终地址。这个过程称为操作数寻址。汇编语言的寻址方式主要指的是存储器操作数的寻址方式
注意:存储器操作数通常存储在数据段、附加数据段或堆栈段,相应的段基址由段寄存器DS、ES或SS提供。注意:存储器操作数通常存储在数据段、附加数据段或堆栈段,相应的段基址由段寄存器DS、ES或SS提供。
(2)获得要执行的下一条指令的地址的方法。(2)获得要执行的下一条指令的地址的方法。 • 在正常情况下,每当BIU取完一条指令,程序计数器IP自动指向下一条,程序就按照指令的先后顺序执行。但当程序执行转移指令或子程序调用指令时,程序的执行顺序必须按照指令的要求改变,这时需要寻找下一条指令的地址。这类寻址发生在程序代码段内,由CS段寄存器提供段基址。这一类寻址方式只涉及转移指令和子程序调用指令,在介绍相关指令时再详细讲解。
1. 立即寻址 • 操作数是立即数,可以是8位或16位的二进制数,也可以是字符常数。 • MOV AX, 2000H ;2000H是立即数操作数 • MOV AH, ’A’ ;’A’是字符常数,等于41H • ADD AL, 6 ;6是立即数操作数 • 立即数作为操作数,这个操作数的寻址方式称为立即寻址,其实它不用寻址。立即数操作数只能作源操作数,不能作为目的操作数。
2. 直接寻址 • 操作数在内存中,指令中直接给出操作数所在的内存单元的偏移地址。可以是数值形式的地址,也可以是符号表示的地址------符号地址。例如: • MOV BL, [2000H] • ;偏移地址为2000H的内存单元的内容传送给BL寄存器。方括号表示地址 。 • BL为8位的寄存器,决定了这条指令为8位的数据传送指令 。
图3-3 直接寻址 3200H 3201H 3202H 3203H 11111000 00000011 10010110 11000011 • MOV BX, [3200H] • ;将偏移地址为3200H为首地址的连续两个内存单元的内容传送给BX寄存器。 • BX为16位的寄存器,决定了这条指令为16位的数据传送指令
汇编语言中常常用一个符号代替数值,如BUFF代替3200H,则上述指令可写为: • MOV BX, [BUFF] • ;或写为 MOV BX, BUFF • BUFF称为符号地址,它的寻址方式仍为直接寻址方式。BUFF需要在程序开始处予以定义 。
汇编指令中存储器操作数的地址都是逻辑地址,例如上面指令中的[2000H]和[3200H],都是段内偏移地址,它们的段基址由DS指明。在通常情况下,存储器操作数的默认在数据段,段基址在DS。在特殊说明的情况下,存储器操作数的段基址也可以替换为CS、ES或SS。汇编指令中存储器操作数的地址都是逻辑地址,例如上面指令中的[2000H]和[3200H],都是段内偏移地址,它们的段基址由DS指明。在通常情况下,存储器操作数的默认在数据段,段基址在DS。在特殊说明的情况下,存储器操作数的段基址也可以替换为CS、ES或SS。
MOV BL, [2000H] ;将DS:2000H之内容送入BL • MOV BX, [3200H] ; 将DS:3200H之内容送入BX
BH BL … 01110101 A3200H A3201H 数据段 10011011 … MOV BX, [3200H] 设DS=A000H,则:A000H*10H+3200H=A3200H 功能: 将A3200H之内容送入AL 将A3201H之内容送入AH
如果操作数的段基址不是DS段,指令中要特别说明。例如在ES段,指令应书写为: • MOV BX, ES:[3200H] • 这种用法称为段超越,物理地址为ESX10H+3200H。 段超越符
3. 寄存器寻址(Register Addressing) • 操作数在CPU内部的寄存器中,例如: • MOV [2000H] ,BL ;操作数BL为寄存器寻址。 • ADD AX, BX ;源和目的操作数的都是寄存器寻址。 • 再如: • MOV AL,BL MOV AX,DX • MOV DS,AX MOV SI,BP
20000H 20001H 20002H 20003H 01010011 01101110 10010110 11000011 图3-4 数据存放 4. 寄存器间接寻址 • 操作数在内存中,内存单元的偏移地址存放在寄存器中。 • MOV AX, [SI] • ;操作数[SI]的寻址方式为寄存器间接寻址 • ;SI的内容为内存单元的偏移地址,DS为段基址,以DSX10H+SI为首地址,取出连续两个内存单元的数据传送给AX。 • 如果DS=2000,SI=02H, • 指令的执行结果为AX=C396H
再如: • MOV DX, [DI] • ;将DS:[DI]指明的连续两个内存单元的数据传送到DX • MOV [BX], AX • ;AX的内容传送到DS:[BX]指明的连续两个内存单元中 • MOV CX, [BP] • ;将SS:[BP]指明的连续两个内存单元的数据传送到CX 为什么是SS呢?
8086CPU中能够作为寄存器间接寻址方式使用的寄存器只有4个:BX、BP、SI、DI。这4个寄存器在作为间接寻址使用时,要用[ ]申明,这时常称为它们为地址指针或间址寄存器。BP在作为间址寄存器时,段基址默认为SS;其它3个的默认段基址为DS。都可以段超越。例如: • MOV DX, ES:[DI] • 上述指令的功能为:从物理地址为ESX10H+DI的内存单元取出两个字节的数据传送给DX。
5. 寄存器相对寻址 • 操作数在内存中,内存单元的偏移地址一部分由间接寻址寄存器提供,一部分是指令给定的8位或16位地址位移量,二者相加形成操作数的有效地址。例如: • MOV AX, [BX+DATA] • ;将以BX+DATA为首地址的连续两个内存单元的数据传送给AX • MOV AL, [SI+20H] • MOV CX, [DI+DATA] • MOV DX, [BP+DATA]
例:MOV AX,DATA[BX] • 假设:(DS)=6000H, (BX)=1000H, DATA=08H • 则内存单元的物理地址为:60000H+1000H+08H=61008H • 指令的执行情况如下: 码段 61008H 数据段 (AX)=5566H
上述指令的书写格式很灵活,也可以如下书写:上述指令的书写格式很灵活,也可以如下书写: • MOV AX, [BX]+DATA • MOV AL, 20H [SI] • MOV CX, DATA [DI] • MOV DX, DATA+ [BP] • 这种寻址方式可用于存取数据表中的数据,用间址寄存器存放数据表首地址,地址位移量指明要存取表中的哪一个数据,可以方便地存取数据表中的任何数据。
例:某数据表的首地址(偏移地址)为TABLE,要取出该表中第10个字节,并存放到AL中,可用如下指令段实现:例:某数据表的首地址(偏移地址)为TABLE,要取出该表中第10个字节,并存放到AL中,可用如下指令段实现: • MOV SI, 9 • MOV AL, [TABLE+SI] • 相对寻址指令的书写格式允许有以下几种: • MOV AL, TABLE[SI] • MOV AL, [SI]DATA • MOV AL, DATA+[SI] • MOV AL, [SI]+DATA • MOV AL, [DATA+SI] • MOV AL, [SI+DATA]
6. 基址--变址寻址 • 操作数在内存中,基址寄存器和变址寄存器相加作为操作数的偏移地址。 • MOV AX, [BX][SI] • ;将BX+SI为首地址的连续两个内存单元的数据送给AX。 • MOV CX, [BP][DI] • ;将BP+DI为首地址的连续两个内存单元的数据送给CX。
MOV AX, [BX][BP] MOV AX, [SI][DI] • 8086CPU中寄存器BX和BP为基址寄存器,SI和DI为变址寄存器。这种寻址方式中,一个基址寄存器加一个变址寄存器构成操作数,操作数的形式只有4种: • [BX][SI] • [BX][DI] • [BP][SI] • [BP][DI]
这种寻址方式里段基址是DS还是SS呢? • 8086汇编规定以基地址为主,如果基址寄存器为BP,则操作数的段基址默认由SS提供;若BX为基址寄存器,则段基址默认由DS提供。 • MOV AX, [BX][DI] • ;源操作数的物理地址为:DSX10H+BX+DI • MOV [BP][SI], DX • ;目的操作数的物理地址为:SSX10H+BP+SI • 基址变址寻址方式适用于处理一维数组,可将首地址存放在基址寄存器中,通过修改变址寄存器的内容来访问数组中的各个元素,它比寄存器相对寻址更加灵活。
7、基址--变址寻址—相对寻址 • 操作数在内存中,操作数的地址由基址寄存器加上变址寄存器再加上地址位移量构成。 • MOV AX, DATA[BX][SI] • MOV AX, [BP][DI] DATA • 假设:(DS)=8000H, (BX)=2000H, (SI)=1000H, DATA=0200H • 则操作数DATA[BX][SI]的物理地址为: • 8000HX10H+2000H+1000H+0200H=83200H • 这种寻址方式主要用于二维数组操作。地址位移量作为数组首地址,两个寄存器分别作为行和列的地址指针,可以很方便实现数据阵列检索
基址--变址—相对寻址指令的书写格式允许有以下几种:基址--变址—相对寻址指令的书写格式允许有以下几种: • MOV AX, DATA[SI][BX] • MOV AX, [BX+DATA][SI] • MOV AX, [BX+DATA +SI] • MOV AX, [BX]DATA[SI] • MOV AX, [BX+SI]DATA • 下列指令是非法的: • MOV AX, [DI+SI+DATA] • MOV AX, [BX+BP+DATA]
8、隐含寻址 • 操作码本身隐含地指明了操作数或部分操作数的地址。如:MUL BL; • ALXBL AX
CPU的寻址方式总结: • 获得操作数所在地址的寻址方式: • 立即寻址 • 直接寻址 • 寄存器寻址 • 寄存器间接寻址 • 寄存器相对寻址 • 基址--变址寻址 • 基址--变址—相对寻址 • 隐含寻址 MOV AX, 3102H MOV AL, [4000H] MOV AL,BL MOV AX,ES:[SI] MOV AX,[SI] MOV AX,DATA[BX] MOV AX, [BX][SI] MOV AX, DATA[DI][BX] MUL BL;
8086指令系统 • 指令中常用的一些符号约定: • OPRD 各种类型的操作数 • src 源操作数 • dst 目的操作数 • acc 累加器AX或AL • port 输入输出端口 • count 计数器
3.3 8086/8088 CPU指令系统 • 指令系统分为六个功能组: • 1、数据传送Data Transfer • 2、算术运算Arithmetic • 3、逻辑运算logic • 4、串操作string manipulation • 5、控制传送control transfer • 6、处理器控制processor control
3.3.1 数据传送类指令 数据传送指令细分为通用数据传送指令、端口输入输出指令、地址传送指令和标志寄存器传送指令。
1. 通用数据传送指令MOV,PUSH,POP,XCHG,XLAT • (1)MOV • 指令格式:MOV dst, src • ①立即数到通用寄存器的数据传送 • MOV AL, 4 ;AL=4 • MOV AX, 1000H ;AX=1000H • MOV SI, 037BH ;SI=037BH
但是:MOV DS, 2000H ;语法错误,不能用立即 数给段寄存器赋值。 • 应该为:MOV AX, 2000 • MOV DS, AX
31500H 31501H 31502H 31503H 00000000 00100000 10010110 11000011 图3-5 数据传送 • ②立即数到存储单元的数据传送 • MOV WORD PTR[DI], 2000H • 将立即数2000H传送到内存单元,内存单元的地址以间接寻址的方式由DI提供。 • 设DS=3000H,DI=1500H,目的操作数的物理首地址为31500H
PTR是属性运算符,功能为修改操作数的类型。 • WORD PTR的作用是将操作数的类型设置为字类型。 • BYTE PTR将操作数的类型设置为字节类型。例如: • MOV BYTE PTR[SI], 4AH • 将立即数4AH传送到内存单元,内存单元的地址以间接寻址的方式由SI提供,传送一个字节。
MOV [DI], 04AH • ;语法错误:源和目的操作数的类型都不确定。 • MOV指令中的两个操作数的类型必须至少有一个是确定的,另一个依附这一个。属性运算符PTR帮助我们确定存储器操作数的类型。
③CPU内部寄存器之间的数据传送 • MOV AL, BL ;BL传送给AL,传送一个字节。 • MOV AX, BX ;BX传送给AX,传送一个字。 • MOV DS, AX ;给数据段寄存器赋值。 • MOV SI, BP ;BP传送给SI,传送一个字。