收藏 分享(赏)

8086指令系统及汇编语言程序设计.ppt

上传人:天天快乐 文档编号:763004 上传时间:2018-04-21 格式:PPT 页数:214 大小:1.57MB
下载 相关 举报
8086指令系统及汇编语言程序设计.ppt_第1页
第1页 / 共214页
8086指令系统及汇编语言程序设计.ppt_第2页
第2页 / 共214页
8086指令系统及汇编语言程序设计.ppt_第3页
第3页 / 共214页
8086指令系统及汇编语言程序设计.ppt_第4页
第4页 / 共214页
8086指令系统及汇编语言程序设计.ppt_第5页
第5页 / 共214页
点击查看更多>>
资源描述

1、第3章 8086/8088指令系统及汇编语言程序设计,3.1 指令格式与寻址方式 3.1.1 项目1:认识8086寻址方式 3.1.2 知识讲解3.2 数据传送指令与串操作指令 3.2.1 项目2:内存数据的移动 3.2.2 知识讲解3.3算术运算指令与位操作指令 3.3.1 项目3:多字节的乘法 3.3.2 知识讲解3.4 控制转移指令与处理器控制指令 3.4.1 项目4:计算|X-Y| 3.4.2 知识讲解3.5汇编语言程序格式 3.5.1 项目5:把字符串显示到屏幕上 3.5.2 知识讲解3.6 程序的基本结构 3.6.1 项目6:折半查找 3.6.2 知识讲解3.7 BIOS和DOS中

2、断 3.7.1 项目7:从键盘中接收字符 3.7.2 知识讲解3.8 子程序结构 3.8.1 项目8:排序 3.8.2 知识讲解,3.1 指令格式与寻址方式3.1.1项目1:认识8086寻址方式1项目要求与目的(1)项目要求:通过各种寻址方式操作,了解8086寻址方式。(2)项目目的:通过项目了解8086汇编指令格式以及掌握8086的寻址方式。2项目程序各种寻址方式的程序代码如下:,3.单步调试过程 目前常用的汇编程序有Microsoft公司推出的宏汇编程序MASM(Microsoft Assembler)和Borland公司推出的TASM(Turbo Assembler)两种。本书采用的是M

3、ASM6.11版本。我们不妨把MASM6.11汇编程序安装在D盘的masm611文件夹下。这里推荐使用Masm Editor编辑器,调试过程如下所示。第1步:用Notepad+编辑以上源程序,以addrmode.asm文件名保存在D:MASM611BIN目录下。需要注意的是汇编的源程序后缀名必须是.asm。第2步:点击开始菜单运行输入“cmd”回车输入“D:”回车输入“cd masm611/bin”回车这时就进入了D:MASM611BIN目录下。操作示意图如图3-1所示。,第3步:用masm汇编程序编译addrmode.asm源文件,用link连接程序连接目标文件(.obj)。 在图3-1中输

4、入“masm addrmode”回车输入“link addrmode”回车如果源程序汇编和连接没有出错,则会生成可执行文件(addrmode.exe)。 第4步:在命令行中输入“cv addrmode.exe” 回车,则出现如下界面。及进入单步调试状态。,在图3-2中按F10,执行指令MOV AX,DATA ,执行后AX=12C3H,结果如图3-3所示。,继续按F10,执行指令MOV DS,AX 。执行后 。按F10,执行指令MOV AX,1234H ,执行后。 按F10,执行指令MOV BX,AX ,执行后。按F10,执行指令MOV AX,VALUE (将DS段中VALUE单元的内容送给AX

5、),执行后。 按F10,执行指令MOV BX,2000H (将立即数2000H送到偏移地址以BX的存储单元)。执行后12C3:1234单元=00H,12C3:1235单元=20H,结果如下图所示。按F10,执行指令MOV DL,80H ,执行后 ,即DL=80H。按F10,执行指令MOV SI,0020H 执行后。 按F10,执行指令MOV BX+SI,DL (将DL的内容传送到偏移地址为BX+SI的存储单元),执行后12C3:1254单元=80H, 结果如下图所示。按F10,执行指令MOV TABLEBX+SI,AL(将AX的内容传送到偏移地址为BX+SI+TABLE的存储单元,TABLE的

6、值等于VALUE的值加4),执行后12C3:1258单元=78H, 结果如下图所示。 接下来这两条指令,返回DOS调用。本程序就调试到这里,下面介绍汇编语言指令格式与寻址方式。,3.1.2 知识讲解1指令格式(1)概述 指令是指计算机完成特定操作的命令,指令系统是计算机能够执行全部命令的集合,它取决于计算机的硬件设计。Intel 80x86/Pentium系列CPU指令系统是向上兼容的,所以,针对某一型号CPU编写的程序,在后续发展出现的新型号CPU上都可以运行,本书以8086/8088典型机为代表,介绍其指令系统。 计算机只能识别二进制代码,所以机器指令是由二进制代码组成的。为便于人们使用而

7、采用汇编语言来编写程序。汇编语言是一种符号语言,它用助记符来表示操作码,用符号或符号地址来表示操作数或操作数地址,它与机器指令是一一对应。,(2)汇编指令格式 计算机中的指令由操作码字段和操作数字段两部分组成,指令的一般格式如下:,操作码部分决定指令的操作类型,指令操作数部分可以是指令所需的操作数,也可以是操作数的地址或关于操作数地址的其他信息。指令操作数根据不同的指令有所区别,通常一条指令包含一个或两个操作数,前者称为单操作数指令,后者称为双操作数指令。双操作数分别称为源操作数(SRC)和目的操作数(DST)。,28086/8088的寻址方式 指令的寻址方式就是寻找指令操作数所在地址的方式,

8、以确定数据的来源和去处。8086/8088指令中的操作数有三种可能的存放位置: 操作数在指令中,即指令的操作数部分就是操作数本身,这种操作数叫立即操作数。 操作数包含在CPU的某个内部寄存器中,这时指令的操作数部分是CPU内部寄存器的一个编码。 操作数在内存的数据区中,这时指令的操作数部分包含此操作数所在的内存地址。 下面介绍8086/8088的几种寻址方式。(1)立即数寻址方式 定义:操作数直接存放在指令中,紧跟在操作码之后,与操作码一起存放在代码段区域。立即数可以是8位、16位。立即数可以用二进制数、八进制数、十进制数以及十六进制数来表示。,【例3-1】MOV AL,10 ;(AL)立即数

9、10(十进制数)MOV AL,00100101B ;(AL)立即数00100101B(二进制数)MOV AL,0AH ;(AL)立即数0AH(十六进制数)MOV AH,58H ;(AH)立即数58H(十六进制数)MOV BX,1234H ;(BX)立即数1234H后两条指令执行结果如图3-7 所示。,图3-7 立即数寻址,注意:立即数寻址方式只能用于源操作数,不能用于目的操作数,且原操作数长度与目的操作数长度一致。主要用于给寄存器赋值。 立即数寻址方式不执行总线周期,执行速度快。 立即数为16位时,低位字节存放在存储器低地址单元,高位字节存放在存储器高地址单元。,(2)寄存器寻址方式 定义:操

10、作数放在寄存器内,由指令直接给出某个寄存器的名字,以寄存器的内容作为操作数。寄存器可以是16位的AX、BX、CX、DX、SI、DI、SP、BP寄存器,也可以是8位的AH、AL、BH、BL、CH、CL、DH、DL寄存器。 【例3-2】 MOV AX,CX ;(AX)(CX) INC AL ;(AL)(AL)+1 指令执行结果如图3-8 所示,图3-8 寄存器寻址,注意: 寄存器寻址方式的指令操作在CPU内部执行,不需要执行总线周期,执行速度快。 寄存器寻址方式既适用于指令的源操作数,也适用于目的操作数,并且可同时用于源操作数和目的操作数。,(3)直接寻址方式 定义:操作数在存储器中,指令中直接给

11、出操作数所在存储单元的有效地址。有效地址(EA)也称为偏移地址,它代表操作数所在存储单元距离段首址的字节数。有效地址是一个无符号的16位二进制数。【例3-3】MOV AH,1234H ;将DS段中1234H单元的内容送给AHMOV AH,VALUE ;将DS段中VALUE单元的内容送给AHMOV AX, 2100H;将DS段中2100H单元的内容送给AL, 2101H单元的内容送给AHMOV BX,ES:【2000H】 ;段超越,操作数在附加段。即 物理地址(ES)*16+2000H,注意: 直接寻址方式的操作数所在存储单元的段地址一般在数据段寄存器DS中。 如果操作数在其他段,则需要在指令中

12、用段超越前缀指出相应的段寄存器名。 VALUE是一种符号表示法,此内容将在伪指令中给予讲解。 在实地址方式下,物理地址16*段地址(DS)+偏移地址(EA),【例3-4】 MOV AX,DS:2000H 解:当(DS)=3000H时,物理地址16*3000H+2000H32000H,指令的执行结果是: (AL)(32000H),(AH)(32001H) 即内存32000H和32001H单元的内容已传送到寄存器AX中。指令的执行情况如图3-9 所示。,图3-9直接寻址指令执行示意图,(4)寄存器间接寻址方式 定义:操作数在存储器中,指令中寄存器的内容作为操作数所在存储单元的有效地址。寄存器可以是

13、某个基址寄存器BX、BP,或某个变址寄存器SI、DI。操作数有效地址EA为:,可以分成两种情况: 以SI、DI、BX间接寻址,则通常操作数在现行数据段DS区域中,物理地址的计算方法为:物理地址=16(DS)+(BX)(寄存器SI、DI类同) 当使用寄存器BP时,操作数所在存储单元的段地址在堆栈段寄存器SS中。物理地址的计算方法为: 物理地址=16(SS)+(BP),【例3-5】 已知:(DS)3000H,(SI)2000H指令:MOV AX,SI ;(AX)(SI)有效地址EA2000H物理地址16(DS)+(SI)163000H+2000H=30000H+2000H32000H 指令执行结果

14、是将32000H和32001H单元的内容送入寄存器AX中。若在指令中规定是段超越的,则BP的内容也可以与其它的段寄存器相加,形成物理地址。指令的执行情况如图3-10 所示。,图3-10 MOV AX,SI 指令的执行示意图,【例3-6】 已知:(DS)3000H,(BP)2000H 指令:MOV AX,DS:BP ;(AX)(BP) 有效地址EA2000H 物理地址(DS)16+(BP)163000H+2000H32000H 这种寻址方式通常用于表格处理,执行完一条指令后,只需修改寄存器内容就可以取出表格的下一项。,(5)寄存器相对寻址方式(或称直接变址寻址方式) 定义:操作数在存储器内,指令

15、中寄存器的内容与指令指定的位移量(DISP)之和作为操作数所在存储单元的有效地址。寄存器可以是基址寄存器BX、BP,也可以是变址寄存器SI、DI。位移量是一个8位(DISP8)或16位(DISP16)的带符号二进制数。有效地址EA的计算方法为:,使用寄存器BX、SI、DI时与数据段寄存器DS有关,使用寄存器BP时与堆栈段寄存器SS有关。以寄存器SI、8位位移量为例,物理地址为:物理地址=16(DS)+(SI)+DISP8(使用寄存器BX、DI类同)以寄存器BP、16位位移量为例,物理地址为:物理地址= 16(SS)+(BP)+DISP16,【例3-7】 已知:(DS)2000H,(SI)100

16、0H,ARRAY2000H(16位位移量)指令:MOVBX,ARRATSI或 MOVBX,ARRAY+SI有效地址EA(SI)+(ARRAY)1000H+2000H3000H。物理地址16(DS)+(SI)+DISP1620000H+1000H+2000H23000H。指令执行结果是将23000H和23001H单元的内容送入寄存器BX中。指令执行情况如图3-11 所示。,图3-11 MOVBX,ARRATSI 指令执行示意图 这种寻址方式同样可用于表格处理,表格的首地址可设置为位移量,利用修改基址或变址寄存器的内容来取得表格中的值。,(6)基址变址寻址方式 定义:操作数在存储器内,指令将基址寄

17、存器(BX或BP)与变址寄存器(SI或DI)内容之和作为操作数所在存储单元的有效地址EA。有效地址EA的计算方法为:EA(BX)/(BP)+(SI)/(DI)。当使用基址寄存器BX时,段寄存器为DS,物理地址计算方法为:物理地址16(DS)+(BX)+(SI)(使用寄存器DI类同)。当使用基址寄存器BP时,段寄存器为SS,物理地址计算方法为:物理地址16(SS)+(BP)+(SI)(使用寄存器DI类同)。【例3-8】 已知:(DS)2000H,(BX)1234H,(SI)5678H指令:MOV AL,BX SI或 MOVAL,BX+SI有效地址EA(BX)+(SI)1234H+5678H68A

18、CH。物理地址16(DS)+ EA20000H+68ACH268ACH。指令执行结果是将268ACH单元的内容送入寄存器AL中。,注意如下是错误书写:MOV AX,BX+BP ;不允许同时使用BX和BPMOV AX,SI+DI ;不允许同时使用SI和DI 基址变址寻址方式中,可以使用段跨越前缀标识操作数所在的段。MOV AX, ES:BX+DI物理地址16(ES)+(BX)+(DI) 这种寻址方式同样适用于数组或表格处理,首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的某个元素。,(7)相对基址变址寻址方式 定义:操作数在存储器内。指令将基址寄存器(BX或BP)与变址寄存器(SI或DI

19、)的内容之和再加上位移量(8位或16位),得到操作数所在存储单元的有效地址。有效地址EA的计算方法为:EA(BX)/(BP)+(SI)/(DI)+DISP8 / DISP16 当使用基址寄存器BX时,段寄存器为DS,物理地址计算方法:物理地址16(DS)+(BX)+(SI)/(DI)+ DISP8/ DISP16当使用基址寄存器BP时,段寄存器为SS,物理地址计算方法:物理地址16(SS)+(BP)+(SI)/(DI)+ DISP8/ DISP16【例3-9】 已知:(DS)2000H,(BX)1000H,(SI)0500H,DA11220H指令:MOVAX,DA1BXSI或MOV AX,DA

20、1 BX+SI或MOV AX,DA1+BX+SI有效地址EA(BX)+(SI)+DISP161000H+0500H+1220H2820H物理地址16(DS)+EA20000H+1000H+0500H+1220H22820H指令执行结果是将22820H、22821H单元的内容送入寄存器AX中。指令执行情况如图3-12所示。,注意如下是错误书写:MOV AX,DATBX+BP ;不允许同时使用BX和BPMOV AX,DATSI+DI ;不允许同时使用SI和DI这种寻址方式通常用于对二维数组的寻址。例如,存储器中存放着由多个记录组成的文件,则位移量可指向文件之首,基址寄存器指向某个记录,变址寄存器则

21、指向该记录中的一个元素。,(8)转移地址有关的寻址方式控制转移指令在段内、段间转移时,使用直接(相对)寻址或间接寻址方式。 直接寻址方式段内直接寻址方式是目标程序和源程序在同一个程序段内,只给出源地址和目标地址的差值,此差值是偏移量,它是一个以IP为基准的8位或16位的带符号补码数。段间直接寻址方式直接给出转移目标地址的段地址和段内位移量,用前者取代CS寄存器当前的值,用后者取代IP中当前的值,使程序从一个代码段转移到另一个代码段。间接寻址方式 段内间接寻址方式,指令转移的有效地址存在一个寄存器或存储器单元中,用它取代当前IP的值,实现程序转移。段间间接寻址方式,指令给出一个存储器地址,从该地

22、址开始的4个字节单元中存放转移目标地址的段内偏移量和段地址,这两个地址在指令执行时用于取代当前的IP和CS的内容,使程序从一个代码段转移到另一个代码段。,3.2数据传送与串操作类指令3.2.1项目2:内存数据的移动1项目要求与目的(1)项目要求:编写程序实现把数据段的字符串数据移动到附加段中。具体要求是把数据段中以dstring地址标号为开始地址的“hello world!”字符串移动到附加段以sstring地址标号为开始地址中去。(2)项目目的:通过项目学习汇编的数据传送指令和串处理类指令,巩固上一节寻址方式,学习汇编程序设计。2项目程序设计(1)程序流程图设计思想:从源串中取一个字符到AL

23、中,然后把刚取到的字符放到目的串指定位置,重复这样的过程,把源串的字符取完为止。程序流程如图3-13所示。(2)程序清单实现这样功能的程序方法很多,下面给出了实现这一功能的完整程序清单。其中16行22行是本程序的核心代码。,(3)调试过程第1步:编译过程请参照项目1的调试指导。第2步:进入程序调试界面,如图3-14所示。,第3步:按F10,执行到MOV CX,000C时,这时程序状态如图3-15所示。,第4步:接着继续按F10执行程序,最终结果如图3-16所示。,从图3-16中可以看出,程序确实把数据段的“hello,world!”移动到附加段中去了。,3.2.2 知识讲解1概述Intel 8

24、086/8088指令系统共有117条基本指令,按照指令功能,可分位6类指令: 数据传送类指令。 算术指令。 逻辑移位指令。 串操作指令。 控制转移指令。 处理机控制类指令。 本书只介绍8086/8088的指令系统。在这一节中,主要讲解数据传送类指令和串处理类指令。数据传送类指令分为通用数据传送指令、累加器专用传送指令、地址传送指令、标志寄存器传送指令和类型转换指令。数据传送是计算机中最基本、最重要的一种操作,也是最常用的一类指令。传送指令是把数据从一个位置传送到另一个位置,除了标志寄存器传送指令外,其余传送类指令均不影响标志位。串操作类指令通常用于处理存放在存储器里的数据串(String),即

25、在连续的主存区域中,字节或字的序列。串操作指令的操作对象是以字(W)为单位的字串,或是以字节(B)为单位的字节串。,2数据传送类指令 数据传送类指令实现CPU内部寄存器之间、CPU与存储器之间、CPU与I/O端口之间的数据传送。 (1)通用数据传送指令 通用传送指令包括:传送指令MOV(move)、进栈指令PUSH(push onto the stack、出栈指令POP(pop from the stack)和交换指令XCHG(exchange)。指令格式及操作如下: MOV 传送指令:把一个字节或字的操作数从源地址传送至目的地址。指令格式:MOV DST,SRC指令执行操作:(DST)(SR

26、C)其中DST表示目的操作数,SRC表示源操作数。MOV 指令传送示意图如图3-17所示。 MOV指令传送信息可以从通用寄存器到通用寄存器,立即数到通用寄存器,立即数到 存储器,存储器到通用寄存器,通用寄存器到存储器,通用寄存器或存储器到除CS外的段寄存器(立即数不能直接送到段寄存器),段寄存器到通用寄存器或存储器。,【例3-10】 MOV 指令的各种格式传送MOV AL,55H ;(AL)立即数55HMOV AX,1234H ;(AX)立即数1234HMOV BL,AL ;(BL)(AL)MOV BX,AX ;(BX)(AX)MOV 2000H,AX ;(2000H)(AL), (2001H

27、)(AH)MOV AX,3000H ;(AL)(3000H), (AH)(3001H)MOV DS,AX ;(DS)(AX)MOV AX,DS ;(AX)(DS)MOV TABLE,DS ;(TABLE)(DS)本例展示了MOV 指令传送功能。,【例3-11】下列MOV指令都是错误的MOV 1234H,AX ;立即数不能用于目标操作数MOV CS,AX ;CS不能用于目标操作数MOV IP,AX ;IP不能用于目标操作数MOV DS,1234H ;立即数不能直接传送给段寄存器MOV AL,BX ;原操作数与目标操作数的位数必须一致MOV BUF1,BUF2 ;不能在两个存储器单元之间传送数据M

28、OV DS,ES ;不能在两个段寄存器单元之间传送数据,注意:MOV指令的两个操作数(源、目的)均可采用不同的寻址方式,但是必须有一个为寄存器。MOV指令可以传送8位或16位的数据,但是必须与8位或16位寄存器相对应。MOV指令不允许把立即数作目的操作数,也不允许向段寄存器送立即数。MOV指令不允许在段寄存器之间、存储器单元之间传送数据。MOV指令不影响标志位。,堆栈操作指令PUSH 进栈指令:把一个字的操作数从源地址压入到堆栈中。POP出栈指令:把一个字的操作数从栈中弹出到目的操作数中。堆栈是一个“后进先出FILO”(或说“先进后出FILO”)的主存区域,位于堆栈段中;SS段寄存器记录其段地

29、址;堆栈只有一个出口,即当前栈顶;用堆栈指针寄存器SP指定;栈顶是地址较小的一端(低端),栈底不变,如图3-18所示。 PUSH指令的格式:PUSH SRC指令执行操作:(SP)(SP)-2 (SP)+1,(SP)(SRC) 功能解释:先将SP的内容减2,再将源操作数的内容(一个字)“压入”到堆栈栈顶的一个字中。POP指令的格式:POP DST指令执行操作:(SCR)(SP)+1,(SP) (SP)(SP)+2功能解释:先将堆栈栈顶的一个字“弹出”到目的操作数的一个字中,再将SP的内容加2。这两条指令只能进行“字”操作,不能进行“字节” 操作,传送时仍遵循高字节放在高地址单元、低字节放在低地址

30、单元的原则。PUSH指令和POP指令允许的操作数及数据传送方向如图3-19所示。,图3-18 堆栈结构示意图,【例3-12】 已知:(AX)=1122H,(BX)=3344H,(SP)=1010H执行指令:PUSH AX ;(SP)100EH,(100FH)11H,(100EH)22HPUSH BX ;(SP)100CH,(100DH)33H,(100CH)44HPOP AX ;(AX)(100DH,100CH),(SP)100EHPOP BX ;(BX)(100FH,100EH),(SP)1010H执行结果:(AX)=3344H,(BX)=1122H,(SP)=1010H【例3-13】堆栈指

31、令错误书写如下:PUSH AL ;字节不能进栈PUSH 1000H ;立即数不能进栈POP AL ;字节不能出栈对象POP CS ;CS不能作为出栈对象POP 1234H ;立即数不能出栈对象,注意: 8086堆栈操作必须是字数据。(操作数不能是立即数) 源操作数SRC、目的操作数DST,可以是存储器、通用寄存器和段寄存器,但是不能将数据弹至段寄存器CS,可以将段寄存器CS的内容压入到堆栈中。 堆栈操作可以用于数据的暂存与恢复、子程序返回地址及中断断点地址的保护与返回。 堆栈操作指令不影响状态标志位。,XCHG交换指令 XCHG交换指令能将源操作数的内容与目的操作数的内容进行交换,可以进行字节

32、交换,也可以进行字交换。 XCHG交换指令格式:XCHG OPR1,OPR2 指令执行操作:(OPR1) (OPR2) XCHG交换指令允许的操作数及数据传送方向如图3-20所示。,图3-20 交换指令数据传送方向如图,【例3-14】 已知:(BX)=1100H,(BP)=3344H,(DI)=0055H,(SS)=2000H,(23399H)=1234H指令: XCHG BX ,BP+DI源操作数的物理地址=16(SS)+(BP)+(DI)=20000H+3344H+0055H=23399H指令执行结果为:(BX)=1234H,(2219BH)=1100H。【例3-15】以下XCHG交换指令

33、都是错误的。XCHG AL,BX ;字节与字不能交换XCHG AX,1000H ;寄存器与立即数不能交换XCHG DS,SS ;段寄存器之间不能不能交换XCHG CS,IP ;CS与IP不能交换,注意: XCHG指令实现两个操作数内容(8位或16位)的互换。 两个操作数不能为段寄存器或立即数,并且不能同时为存储器操作数(则两个操作数至少有一个在寄存器中)。 CS、IP寄存器的内容不能交换。XCHG指令不影响状态标志位。,(2)累加器专用传送指令累加器专用传送指令包括:IN(input)输入、OUT(output)输出、XLAT(translate) 查表。本组指令以累加器为中心,实现数据的输入

34、/输出和换码操作。指令格式及操作如下: IN /OUT (输入/输出)指令8086/8088采用的是I/O端口与存储器是单独编址的,因此访问I/O端口只能用IN/OUT两条指令(不能使用任何其他指令),IN/OUT指令按长度分为长格式和短格式。长格式指令代码为2个字节,第二字节用PORT表示端口号,它指定的端口地址范围是00FFH。短格式指令代码为1个字节,它指定的端口地址范围是0000FFFFH。,用IN指令完成从输入端口到CPU的数据传送。 长格式:IN AL,PORT(字节) IN AX,PORT(字)执行的操作: (AL)(PORT)(字节) (AX)(PORT+1,PORT)(字)短

35、格式:IN AL,DX (字节)IN AX,DX(字)执行的操作:AL(DX)(字节) AX(DX)+1,DX)(字)用OUT指令完成从CPU到输出端口的数据传送。长格式:OUT PORT,AL(字节) OUTPORT,AX(字)执行的操作:(PORT)(AL)(字节) (PORT+1,PORT)(AX)(字)短格式:OUT DX,AL(字节) OUT DX,AX(字)执行的操作:(DX)(AL)(字节) (DX)+1,(DX)AX(字),【例3-16】 要完成下列输入/输出操作:(a)从60H端口输入一个字节数据;(b)从61H端口输出一个字节数据32H;(c)从2160H端口输入一个字节数

36、据;(d)从2161H端口输出一个字节数据64H;解:(a)题可用两种方法:方法1:IN AL,60H 方法2: MOV DX,60H IN AL,DX(b)题可用两种方法:方法1:MOV AL,32H 方法2: MOV AL,32H OUT 61H,AL MOV DX,61H OUT DX ,AL(c)题只能用一种方法:MOV DX,2160H IN AL,DX(d)题只能用一种方法:MOV DX,2161H MOV AL,64H OUT DX,AL,需要注意的是在(a)和(b)中,方法1为直接寻址,端口地址在指令中,是 8位无符号数(0255);方法2为间接寻址,端口地址在DX中,是 16

37、位无符号数(065535)。在(c)和(d)中,I/O指令均为间接寻址,端口地址在DX中,是 16位无符号数(065535)。在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000FFFFH。其中前256个端口(0FFH)可以直接在指令中指定,这就是长格式中的PORT, 此时机器指令用二个字节表示,第二个字节就是端口号。所以用长格式时可以在指定中直接指定端口号,但只限于前256个端口。当端口号=256时,只能使用短格式,此时,必须先把端口号放到DX寄存器中(端口号可以从0000到0FFFFH),然后再用IN或OUT指令来 传送信息。,XLAT查表指令指令

38、格式:XLAT OPR或者 XLAT执行的操作:(AL)(BX)+(AL) 指令功能:完成一个字节的查表转换。它将数据段中偏移地址为BX与AL寄存器之和的存储单元的内容送入AL寄存器。在使用该指令时,应首先在数据段中建立一个长度小于256B的表格,表的首地址置于BX中,再将代码(相对于表格首地址的位移量)存入寄存器AL中。指令执行后,所查找的对象存于AL中, BX内容保持不变。【例3-17】 已知:(DS)=3000H,(BX)=0030H,(AL)=01数据表: (30030H)=30H (30031H)=31H (30032H)=32H指令: XLAT指令执行结果:(AL)=31H,即将地

39、址30031H单元的内容31H送入寄存器AL中。即执行指令后,AL寄存器的内容01换成了31H。,地址传送指令地址传送指令包括:LEA(load effective address)有效地址送寄存器、LDS(load DS with pointer)指针送寄存器和DS、LES(load ES with pointer)指针送寄存器和ES。这组指令的功能是完成把地址送到指定通用寄存器(用REG表示)中。地址传送指令不影响状态标志位。REG 不能为段寄存器,SRC 必须为存储器寻址方式。LEA 有效地址送寄存器指令格式: LEA REG,SRC执行的操作:(REG)SRC指令把源操作数(存储器)的

40、有效地址送到指定的16位通用寄存器中,REG 不能为段寄存器。源操作数可使用除立即数和寄存器外的任一种存储器寻址方式。LDS 指针送寄存器和DS指令格式:LDS REG,SRC执行的操作:(REG)(SRC) (DS)(SRC+2)把源操作数(双字存储器)中的低字送入16位通用寄存器中,高字送入DS中。LES 指针送寄存器和ES指令格式: LES REG,SRC执行的操作:(REG)(SRC) (ES)(SRC+2)把源操作数(双字存储器)中的低字送入16位通用寄存器中,高字送入ES中。,【例3-18】 LEA 有效地址送寄存器指令LEA AX,5678H;(AX) 5678H与MOV AX,

41、5678H等价【例3-19】 LDS指令与LES指令已知:(DS)=8000H (81480H)=33CCH (81482H)=2468H。指令:LDS SI,1480H物理地址=16(DS)+1480H=81480H。指令执行结果:(SI)=33CCH,(DS)=2468H(物理地址加后地址中的内容传给)。,标志寄存器传送指令 标志寄存器传送指令包括:LAHF(load AH with flags)标志送AH、SAHF(store AH into flags)AH送标志寄存器、PUSHF(push the flags)标志进栈、POPF(pop the flags) 标志出栈。 本组指令用来

42、保存标志寄存器和恢复标志寄存器。这组指令中的LAHF和PUSHF不影响标志位,SAHF和POPF由装入值来确定标志位的值。LAHF指令指令格式:LAHF执行的操作:(AH)(PSW的低字节)SAHF指令 指令格式:SAHF 执行的操作:(PSW的低字节)(AH)PUSHF 标志进栈指令 指令格式:PUSHF 执行的操作:(SP)(SP)-2 (SP)+1,(SP)(PSW)POPF 标志出栈指令指令格式:POPF 执行的操作:(SP)(SP)-2(PSW)(SP)+1,(SP),符号扩展指令 符号扩展指令包括:CBW(convert byte to word)字节扩展为字、CWD(conver

43、t word to double word)字扩展为双字。指令格式及操作如下:CBW 字节转换为字指令 指令格式:CBW 执行的操作:将AL中的8位带符号数扩展为16位并送入AX中,也就是将AL的最高位送入AH的所有各位,即如果(AL)的最高有效位位0,则(AH)=00H;如果(AL)的最高有效位为1,则(AH)=0FFH。CWD 字转换为双字指令指令格式:CWD 执行的操作:AX的内容符号扩展到DX,形成DX:AX中的双字。即如果(AX)的最高有效位位0,则(DX)=0000H;如果(AX)的最高有效位为1,则(DX)=0FFFFH。【例3-20】已知:(AX)= 0BA45H 指令:CBW

44、 ;(AX)=0045H 指令:CWD ;(DX)=0FFFFH (AX)=0BA45H,3串操作类指令串操作类指令包括:MOVS(move string)串传送、CMPS(compare string)串比较、SCAS(scan string)串搜索、LODS(load from string)串取、STOS(store in to string)串存;与上述串操作基本指令配合使用的前缀有:REP(repeat)重复、REPE/REPZ(repeat while equal / zero)相等/为零重复、REPNE/REPNZ(repeat while not equal / not zero)不相等/不为零重复。指令格式及操作如下:MOVS 串传送指令指令格式:MOVSB 执行的操作:字节操作,当DF=0时,则(DI)(SI)(SI)(SI)+1,(DI)(DI)+1当DF=1时,则(DI)(SI)(SI)(SI)-1,(DI)(DI)-1指令格式:MOVSW 执行的操作:字操作,当DF=0时,则(DI)(SI)(SI)(SI)+2,(DI)(DI)+2当 DF=1时,则(DI)(SI)(SI)(SI)-2,(DI)(DI-2),

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报