ImageVerifierCode 换一换
格式:DOCX , 页数:93 ,大小:549.88KB ,
资源ID:3271884      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3271884.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第三章汇编语言指令系统.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第三章汇编语言指令系统.docx

1、第三章汇编语言指令系统第三章 8086/8088指令系统指令是汇编语言程序设计的基础,只有熟练掌握8086/8088各条指令的书写格式、功能及注意事项,程序设计员才能在编写汇编程序的过程中得心应手。本章重点讲解指令执行时获取操作数的七种寻址方式以及8086/8088的指令系统。3.1 指令系统简介3.1.1 指令系统概述能够被8086/8088 CPU识别并执行的指令集,称为8086/8088的指令系统。8086/8088的指令系统按照功能主要可以分为以下6类:(1)数据传送类指令(2)算术运算类指令(3)逻辑类指令(4)控制转移类指令(5)串处理类指令(6)其他指令3.1.2 汇编指令格式及

2、特点汇编指令格式与其他微机的指令格式一样,均由以下几部分组成:标号: 操作码 操作数 ;注释其中,在上述指令格式中用方括号扩起来的部分是可有可无的,所以在一条指令中只有操作码是必须具备的。例如一条完整的指令语句如下:HERE: MOV AX,1234H ;将立即数1234H送入AX寄存器(1)标号标号是由英文字母、数字及其他专用字符所组成的字符串,一般由字母和下划线打头。它代表了该指令的符号地址,标号后面必须接冒号。(2)操作码操作码是由助记符表示的字符串,它规定了指令的操作功能。操作码和操作数之间由空格分隔。(3)操作数操作数是指参加操作的数据或数据的地址。如果有多个操作数,必须使用逗号分隔

3、。(4)注释注释是为该条指令作的说明注解,以便于程序设计员阅读与调试。8086/8088指令系统中,操作数可以有1、2个,也可以没有。例如:MOV AX,CX ;双操作数指令INC AX ;单操作数指令NOP ;无操作数指令8086/8088的各条指令在执行前必须转变为CPU可以识别的机器码,这是指令和伪指令之间本质的区别,因为伪指令是不会被汇编程序汇编成机器码的。伪指令在第四章中进行介绍。例3-1编写一段汇编程序,通过DEBUG程序的U命令查看程序中各条指令所对应的机器码。解:给出代码段,该代码段包含五条指令,然后通过上机观察这五条指令所对应的机器码。程序代码编写如下:CSEG SEGMEN

4、TASSUME CS:CSEGSTART:MOV AX,0ABCDH ;AX0ABCDHMOV BX,1234H ;BX1234HMOV CX,5678H ;CX5678HMOV AH,4CH INT 21H ;返回DOSCSEG ENDSEND START保存该文件,名称为111.ASM后,通过MASM程序汇编成111.OBJ,再通过LINK程序连接成111.EXE,再使用DEBUG 111.EXE命令中的U查看这五条指令所对应的机器码,结果如图3-1所示。图3-1 机器码示意图由图3-1可知,MOV AX ,0ABCDH 指令的机器码为B8CDAB,其中B8为该指令的操作码,CDABH表示

5、存储器的低地址存储了0CDH,高地址存储了ABH,根据高高低低原则,该数据应该为ABCDH,很明显,该数据即为指令中的立即数OABCDH。同理,MOV BX,1234H指令的机器码为BB3412;MOV CX,5678H指令的机器码为B97856。注意:伪指令是不会被编译成机器码的。该例题中,伪指令SEGMENT、ASSUME、ENDS等伪指令均没有在机器码中出现。3.1.3 符号说明为了方便指令系统的讲解,下面把描述指令的一些符号作一简单约定。(1) OPR:表示操作数;(2) DST:表示目的操作数;(3) SRC:表示源操作数;(4) REG:表示16位通用寄存器或8位寄存器;(5) I

6、mm16:表示16位立即数;(6) Imm8:表示8位立即数;(7) Imm:表示8位或16位立即数;(8) EA:表示有效地址;(9) mem:表示存储器单元;(10)SegReg:表示段寄存器。(11)PORT:表示端口3.2 寻址方式指令中的操作码告诉CPU执行何种操作,而指令中的操作数即为操作的对象。在编写程序的过程中,我们往往不会在指令中直接给出操作数,而是给出操作数所在寄存器的名称或操作数所在存储单元的逻辑地址。寻址方式就是如何根据指令提供的信息寻找到操作对象。8086/8088提供了7种寻址方式用于寻找操作数,在学习的过程中请注意寻址方式的特征及操作数所在的位置。3.2.1 立即

7、寻址方式如果在指令中直接给出了操作数,无需再去寻找操作数了,这种寻址方式我们称为立即寻址方式。我们把直接给出的操作数称为立即数。立即寻址方式的特征是在指令中出现的是立即数,并且立即数是以常量形式出现的,在机器码中可以观测到该立即数。例如:MOV AX,1234HMOV CX,40DMOV AX,“a”MOV BL,“b”以上指令均为立即寻址方式,其中1234H、40D、字符a、字符b均为立即数,并且它们均为常量。其中,字符a代表的是0061H立即数,而字符b代表的是62H立即数,因为它们必须符合数据类型相匹配的原则。指令MOV AX,“a”中,目的操作数AX为16位寄存器,所以字符a自动扩展到

8、16位。而指令MOV BL,“b”中,目的操作数BL为8位寄存器,因为字符b的ASCII码也是8位的,与8位BL寄存器是相匹配的,所以字符b就无须扩展成16位了。例3-2 编写一个程序,将立即数0FFFFH送入BX寄存器,0ABCDH送入CX寄存器,1234H送入DX寄存器。解:该程序执行的结果是将立即数0FFFFH、0ABCDH以及1234H分别送入BX、CX和DX寄存器。如图3-2所示。图3-2 立即数寻址源程序如下:CSEG SEGMENTASSUME CS:CSEGSTART: MOV BX,0FFFFH ;立即数1234H送入BX寄存器 MOV CX,0ABCDH ;立即数0ABCD

9、H送入CX寄存器 MOV DX,1234H ;立即数1234H送入DX寄存器 MOV AH,4CH INT 21H ;返回DOSCSEG ENDSEND START将以上程序输入完毕后保存为111.ASM文件后,通过MASM程序对其汇编,再通过LINK程序连接成111.exe。输入DEBUG 111.exe命令,使用U命令反汇编后,再输入“G 000B”命令执行程序。结果如图3-3所示。图 3-3程序调试结果图由图3-3可知,立即数存放在代码段中。注意:(1)立即数只能出现在源操作数中,不能出现在目的操作数中。(2)立即寻址方式中,立即数的位数必须与目的寄存器的位数相符合。例如MOV AL,1

10、234H是一条错误的指令,因为AL是8位寄存器,而1234H立即数是16位数据。(3)立即数可以以数值形式出现,也可以以字符或字符串形式出现。如果以字符串形式出现,则必须注意操作数的类型必须匹配。例如MOV AX,“ab”指令也为合法指令,该指令等价于MOV AX,6162H。而MOV AX,“abc”指令为非法指令,因为字符串“abc”的位数超过了AX寄存器的最大位数。3.2.2 寄存器寻址方式如果操作数存储在某个寄存器中,并且以寄存器的形式出现在指令中,这种寻址方式我们称为寄存器寻址方式。例如:MOV AX,BXADD AX,CXMOV AX,SI以上指令均为寄存器寻址方式,操作数分别存放

11、在BX、CX、SI中。例3-3 将立即数5577H放入寄存器AX中,再送入CX寄存器。解:该程序首先采用立即寻址方式将立即数5577H送入AX寄存器,再采用寄存器寻址方式将AX的内容5577H送入CX寄存器,数据寻址方式如图3-4所示。图3-4 寄存器寻址程序代码编写如下:CSEG SEGMENTASSUME CS:CSEGSTART: MOV AX,5577H ;立即数5577H送入AX MOV CX,AX ;该指令为寄存器寻址方式,其功能为AX的内容送入CX。 MOV AH,4CH INT 21H ;返回DOSCSEG ENDSEND START将以上程序输入完毕后保存为111.ASM文件

12、后,通过MASM程序对其汇编,再通过LINK程序连接成111.exe。输入DEBUG 111.exe命令后,使用U命令反汇编后,再输入“G 0007”命令执行该程序。结果如图3-5所示。图 3-5 程序调试结果图注意:(1)CPU访问寄存器比访问存储器快,所以使用寄存器提供操作数可提高运算速度。(2)寄存器寻址方式中也必须注意两个操作数的类型必须相匹配。(3)寄存器寻址方式中,源操作数可以使用8位或16位通用寄存器,还可以使用段寄存器,但是不允许使用专用寄存器IP和FR。3.2.3 直接寻址方式如果在指令中给出操作数的偏移地址(EA),我们称这种寻址方式为直接寻址。直接寻址方式的特征是:在指令

13、中给出的偏移地址EA是被方括号扩起来的一个常量。这种寻址方式给出了操作数所在数据段(还可以为附加段)的偏移量,所以寻找该操作数还需要确定操作数所在段的段首址,然后利用“物理地址=段首址16D+EA”求得操作数的物理地址。例如:MOV AX,DS:2000H ;AX(DS16+2000H)MOV CX,ES:0ABCDH ;CX(ES16+ABCDH)以上指令均采用了直接寻址方式,其中2000H、0ABCDH均为操作数的偏移量。说明:(1)当采用了直接寻址方式时,给出的直接地址前面必须给出段超越前缀,否则为非法指令,后续章节中如果指令中采用了直接寻址方式时,都必须符合该说明。(2)直接寻址方式一

14、般可以访问数据段、堆栈段或附加段。(3)直接地址可以使用负数表示偏移量,如MOV BX,-0020H指令为合法指令,但是编译为机器码后该指令为MOV BX,FFE0H。也就是说,如果在指令中给出的直接地址是负数,则汇编过程中MASM汇编程序会对该负数进行求补。例3-4 编写一个程序,将附加段中MESS单元的字内容(3322H)送入BX寄存器。解:该程序所需要的操作数在附加段中,所以必须取得附加段的段首址,然后再根据求物理地址的公式查找该操作数。寻址过程如图3-6所示。图3-6 直接寻址源程序如下:EXTRA SEGMENTMESS DB 22H,33H ;在附加段中定义数据22H和33HEXT

15、RA ENDSCSEG SEGMENTASSUME CS:CSEG,ES:EXTRASTART:MOV AX,EXTRA ;AX附加段首地址MOV ES,AX ;将附加段的段首址送ES寄存器MOV BX,ES:0000H ;将ES:0000单元内容送入BX寄存器MOV AH,4CHINT 21HCSEG ENDSEND START该程序的MOV AX,EXTRA以及MOV ES,AX这两条指令功能是将附加段的段首址送ES寄存器,即确定了附加段的段首址。如果没有这两条指令,则系统以默认的ES值进行计算操作数的物理地址,从而会导致程序的结果出现错误。将以上程序输入完毕后保存为111.ASM文件后,

16、通过MASM程序对其汇编,再通过LINK程序连接成111.exe。输入DEBUG 111.exe命令,使用U命令反汇编后,再输入“G 000C”命令执行该程序。结果如图3-7所示。图 3-7 程序调试结果图由图3-7可知,MOV BX,ES:0000H指令采用了直接寻址方式,它的功能是将附加段中偏移量为0000H单元的内容送入BX寄存器。因为我们在附加段中定义了2个数据,分别是22H和33H并存储在附加段中。其中,22H数据占用ES:0000H单元,33H数据占用ES:0001H单元,根据高高低低原则,0B47:0000单元的字内容为3322H。附加段数据存储如图3-8所示。图3-8 附加段存

17、储数据示意图3.2.4 寄存器的间接寻址方式将操作数的直接地址送入基址寄存器BX、BP或变址寄存器SI或DI中的任意一个,在指令中使用这些存储了直接地址的寄存器作为操作数的地址指针,实现操作数的提取或存储,我们将这种寻址方式称为寄存器的间接寻址方式。寄存器的间接寻址方式的特征是:在指令中出现了用方括号扩起来的基址寄存器BX、BP或变址寄存器SI或DI。例如:MOV AX,BX ;AX(BX)MOV CX,SI ;CX(SI)以上指令均采用了寄存器的间接寻址方式,其中BX、SI为存放了操作数直接地址的寄存器。说明:(1)寄存器的间接寻址只能采用BX、BP、SI、DI四个寄存器,其它寄存器不允许使

18、用。(2)寄存器的间接寻址与直接寻址方式类似,只不过寄存器的间接寻址方式是在指令中给出了存放了操作数直接地址的寄存器。(3)当采用BX、SI、DI寄存器时,操作数存放在数据段中,段寄存器采用DS;当采用BP寄存器时,操作数存放在堆栈段中,段寄存器采用SS。例3-5 编写一个程序,采用BX寄存器间接寻址方式将数据段中的0AB05H字数据送入CX寄存器。解:该题需要知道数据0AB05H所在数据段的段首址及偏移量,然后将数据的偏移量送入BX(当然也可以使用SI、DI)寄存器,然后采用寄存器间接寻址指令将BX所指向的字单元内容送CX寄存器。寻址过程如图3-9所示。图3-9 寄存器间接寻址源程序如下:D

19、SEG SEGMENTMESS DB 05H,0ABH ;在附加段中定义数据05H和0ABHDSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AX ;将数据段的段首址送DS寄存器MOV BX,OFFSET MESS ;操作数偏移地址送入了BX寄存器MOV CX,BX ;将BX所指向之字单元内容送CX寄存器MOV AH,4CHINT 21H ;返回DOSCSEG ENDSEND START将以上程序输入完毕后保存为111.ASM文件后,通过MASM程序对其汇编,再通过LINK程序连接成111.exe。输入DEBU

20、G 111.exe命令,使用U命令反汇编后,再输入“G 000C”命令执行该程序。结果如图3-10所示。图3-10 程序调试结果图由图3-10可知,操作数的逻辑地址应该为:0B47:0000,通过MOV CX,BX指令,我们将DS:BX所指向的0B47:0000字节单元的内容05H与0B47:0001字节单元的内容0ABH送入CX寄存器,根据高高低低存储原则, CX应该为AB05H。如果用户使用了BP作为寄存器的间接寻址,则操作数在堆栈段中,这时必须用堆栈的段寄存器SS作为段首地址,再加BP中的偏移量形成操作数的物理地址。物理地址计算公式如下:物理地址=SS16D+BP例3-6编写一个程序,采

21、用BP寄存器间接寻址方式将堆栈段中的1234H字数据送入DX寄存器。解:该题首先需要将数据1234H送堆栈,堆栈是一块特殊区域,不能直接定义堆栈段的数据,所以我们使用PUSH指令存储数据1234H至堆栈,然后将数据所在堆栈段的段首址送SS段寄存器,数据的偏移量送BP寄存器,最后采用寄存器间接寻址指令将BX所指向的字单元内容送DX寄存器。寻址过程如图3-11所示。图3-11 BP寄存器间接寻址源程序如下:STACK1 SEGMENT STACK ;定义堆栈 VAR1 dW ? ;在堆栈区定义一个保留空间STACK1 ENDSCSEG SEGMENT ASSUME CS:CSEG,SS:STACK

22、1 START: MOV AX,STACK1 MOV SS,AX ;AX堆栈段的段首址 MOV AX,1234H PUSH AX ;压入堆栈 MOV BP,SP ;BP堆栈的当前指针 MOV DX,BP ;DXBP所指向字单元 MOV AH,4CH INT 21H ;返回DOS CSEG ENDSEND START将以上程序输入完毕后保存为111.ASM文件后,通过MASM程序对其汇编,再通过LINK程序连接成111.exe。输入DEBUG 111.exe命令,使用U命令反汇编后,再输入“G 0010”命令执行该程序。结果如图3-12所示。图3-12 程序调试结果图3.2.5 相对寄存器寻址方

23、式在这种寻址方式中,操作数存放在存储器中,而操作数的有效地址EA由BX、BP、SI、DI中的任意一个寄存器的内容再加上指令中给出的8位或16位位移量之和组成。我们将这种寻址方式称为寄存器的相对。寄存器的相对寻址方式的特征是:在寄存器的间接寻址方式基础上,基址寄存器BX、BP或变址寄存器SI或DI再加上一个8位或16位位移量,其和构成操作数的有效地址。例如:MOV AX,BX+2000H ;AX(DS16D+BX+2000H)MOV CX,SI+12H ;CX(DS16D+SI+12H)说明:(1)寄存器的相对寻址只能采用BX、BP、SI、DI四个寄存器,其它寄存器不允许使用。(2)寄存器的相对

24、寻址与寄存器的间接寻址方式类似,只不过寄存器的相对寻址方式在指令中还必须另外给出一个8位或16位位移量,与基址寄存器BX、BP或变址寄存器SI或DI的内容共同构成操作数的有效地址。(3)当采用BX、SI、DI寄存器时,操作数存放在数据段中,段寄存器采用DS;当采用BP寄存器时,操作数存放在堆栈段中,段寄存器采用SS。这一点和寄存器的间接寻址是相同的。例3-7 编写一个程序,采用SI寄存器的相对寻址方式,将数据段中以BLOCK打头的数据块的第五个字数据送入DX寄存器。解:操作数存储在数据块BLOCK中,相对于BLOCK变量来说,操作数地址还需要偏移5个字单元。所以我们将数据块BLOCK的起始地址

25、送入SI寄存器后,在采用寄存器相对寻址指令时应该加上位移量8,使SI加8指向正确的操作数,然后再将该字单元的内容送DX寄存器。寻址过程如图3-13所示。图3-13 寄存器相对寻址源程序如下:DSEG SEGMENT BLOCK DW 1234H,2345H,3456H,4567H,5678H,6789H;定义6个数据DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEG MOV DS,AX MOV SI,OFFSET BLOCK ;取数据块首址赋予SI MOV DX,SI+8 ;DX(SI+8) MOV AH,4CH INT

26、21H ;返回DOS CSEG ENDS END START该程序中数据存储如图3-14所示。图3-14 数据块BLOCK由图3-14可知,数据5和数据1之间相差8个字节,所以SI寄存器应该加8。保存该文件后,通过MASM程序汇编及LINK程序后,生成111.exe文件,输入DEBUG 111.exe命令,使用U命令反汇编后,再输入“G 000D”命令执行该程序。结果如图3-15所示。图3-15 程序调试结果图注意:(1)寄存器相对寻址中,8位或16位偏移量可以为正也可以为负数。例如MOV DX,SI-2指令为合法指令,其含义是SI所指向单元向低地址方向移动2字节。(2)这种寻址方式同样可以使

27、用段超越前缀,以便取得其他段的数据。3.2.6 基+变寻址方式在这种寻址方式中,在指令中给出一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI),它们两者的内容之和为操作数的有效地址EA,我们将这种寻址方式称为基+变寻址方式。这种寻址方式求操作数的物理地址有以下两种情况:(1)如果使用了BX作为基址寄存器与SI或DI相配合,则操作数物理地址为:PA=DS16D+BX+SI或 PA=DS16D+BX+DI(2)如果使用了BP作为基址寄存器与SI或DI相配合,则操作数物理地址为:PA=SS16D+BP+SI或 PA=SS16D+BP+DI例3-8 将上例3-7采用寄存器基+变寻址方式进行实现

28、。解:我们将数据块首地址送BX寄存器,操作数所在数据的偏移量8送SI寄存器,则可以达到设计要求。寻址方式如图3-16所示。图3-16 基+变寻址方式程序修改如下:DSEG SEGMENT BLOCK DW 1234H,2345H,3456H,4567H,5678H,6789H;定义6个数据DSEG ENDSCSEG SEGMENTASSUME CS:CSEG,DS:DSEGSTART:MOV AX,DSEGMOV DS,AXMOV BX,OFFSET BLOCK ;取数据块首址赋予BXMOV SI,0008H ;段内偏移量赋予SIMOV DX,BX+SI ;DX(BX+SI)MOV AH,4C

29、HINT 21H ;返回DOS CSEG ENDS END START该程序的调试结果与例题3-7的调试结果相同。注意:在这种寻址方式中,基址寄存器BX与BP只能选用其中的一个,变址寄存器SI、DI也只能选用其中的一个,不允许同时为基址寄存器,也不允许同时为变址寄存器。3.2.7 相对的基+变寻址方式这种寻址方式是在基+变寻址方式的基础上再加上一个8位或16位位移量,它们三者内容之和为操作数的有效地址。我们将这种寻址方式称为相对的基+变寻址方式。这种寻址方式求操作数的物理地址有以下两种情况:(1)如果使用了BX作为基址寄存器与SI或DI相配合,则操作数物理地址为:PA=DS16D+BX+SI+

30、8(或16位)位移量或 PA=DS16D+BX+DI+8(或16位)位移量(2)如果使用了BP作为基址寄存器与SI或DI相配合,则操作数物理地址为:PA=SS16D+BP+SI+8(或16位)位移量或 PA=SS16D+BP+DI+8(或16位)位移量例3-9以指令MOV AX,BX+DI+0340H为例,说明该种寻址方式操作过程。解:设DS=2000H,BX=1500H,DI=1000H,则PA= DS16D+BX+DI+ 16位偏移量,即PA=20000H+1500H+1000H+0340H=22840H,设(22840H)字单元内容=475BH,则该指令操作如图3-17所示。由图3-17可知,AX=475BH。图3-17 相对基+变寻址方式注意:在这种寻址方式中,基址寄存器BX与BP不能同时使用,变址寄存器SI、DI也不能同时使用,请读者加以注意。3.3 数据传送类指令数据传送类指令又可分为:传送指令、交换指令、地址传送指令、堆栈操作指令以及输入输出指令。输入输出指令在第六章予以介绍。数据传送类指令对各个标志位没有影响。3.3.1 传送指令MOV1. 指令格式传送指令是使用得最频繁的指令。指令格式:MOV DST,SRC功能:该指令把一个字节或一个字从源操作数SRC送至目的操作数DST。说明:源操作数可以是累加器、通用寄存器、段

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1