![[电脑基础知识]第三章汇编语言指令系统.doc_第1页](http://file.renrendoc.com/FileRoot1/2019-2/22/be9cd7ec-5c20-4338-aa96-ef3c1d102b50/be9cd7ec-5c20-4338-aa96-ef3c1d102b501.gif)
![[电脑基础知识]第三章汇编语言指令系统.doc_第2页](http://file.renrendoc.com/FileRoot1/2019-2/22/be9cd7ec-5c20-4338-aa96-ef3c1d102b50/be9cd7ec-5c20-4338-aa96-ef3c1d102b502.gif)
![[电脑基础知识]第三章汇编语言指令系统.doc_第3页](http://file.renrendoc.com/FileRoot1/2019-2/22/be9cd7ec-5c20-4338-aa96-ef3c1d102b50/be9cd7ec-5c20-4338-aa96-ef3c1d102b503.gif)
![[电脑基础知识]第三章汇编语言指令系统.doc_第4页](http://file.renrendoc.com/FileRoot1/2019-2/22/be9cd7ec-5c20-4338-aa96-ef3c1d102b50/be9cd7ec-5c20-4338-aa96-ef3c1d102b504.gif)
![[电脑基础知识]第三章汇编语言指令系统.doc_第5页](http://file.renrendoc.com/FileRoot1/2019-2/22/be9cd7ec-5c20-4338-aa96-ef3c1d102b50/be9cd7ec-5c20-4338-aa96-ef3c1d102b505.gif)
已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章 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 汇编指令格式及特点汇编指令格式与其他微机的指令格式一样,均由以下几部分组成:标号: 操作码 操作数 ;注释其中,在上述指令格式中用方括号扩起来的部分是可有可无的,所以在一条指令中只有操作码是必须具备的。例如一条完整的指令语句如下:HERE: MOV AX,1234H ;将立即数1234H送入AX寄存器(1)标号标号是由英文字母、数字及其他专用字符所组成的字符串,一般由字母和下划线打头。它代表了该指令的符号地址,标号后面必须接冒号。(2)操作码操作码是由助记符表示的字符串,它规定了指令的操作功能。操作码和操作数之间由空格分隔。(3)操作数操作数是指参加操作的数据或数据的地址。如果有多个操作数,必须使用逗号分隔。(4)注释注释是为该条指令作的说明注解,以便于程序设计员阅读与调试。8086/8088指令系统中,操作数可以有1、2个,也可以没有。例如:MOV AX,CX ;双操作数指令INC AX ;单操作数指令NOP ;无操作数指令8086/8088的各条指令在执行前必须转变为CPU可以识别的机器码,这是指令和伪指令之间本质的区别,因为伪指令是不会被汇编程序汇编成机器码的。伪指令在第四章中进行介绍。例3-1编写一段汇编程序,通过DEBUG程序的U命令查看程序中各条指令所对应的机器码。解:给出代码段,该代码段包含五条指令,然后通过上机观察这五条指令所对应的机器码。程序代码编写如下:CSEG SEGMENTASSUME 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表示存储器的低地址存储了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) Imm16:表示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 立即寻址方式如果在指令中直接给出了操作数,无需再去寻找操作数了,这种寻址方式我们称为立即寻址方式。我们把直接给出的操作数称为立即数。立即寻址方式的特征是在指令中出现的是立即数,并且立即数是以常量形式出现的,在机器码中可以观测到该立即数。例如:MOV AX,1234HMOV CX,40DMOV AX,“a”MOV BL,“b”以上指令均为立即寻址方式,其中1234H、40D、字符a、字符b均为立即数,并且它们均为常量。其中,字符a代表的是0061H立即数,而字符b代表的是62H立即数,因为它们必须符合数据类型相匹配的原则。指令MOV AX,“a”中,目的操作数AX为16位寄存器,所以字符a自动扩展到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 ;立即数0ABCDH送入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,1234H是一条错误的指令,因为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以上指令均为寄存器寻址方式,操作数分别存放在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文件后,通过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),我们称这种寻址方式为直接寻址。直接寻址方式的特征是:在指令中给出的偏移地址EA是被方括号扩起来的一个常量。这种寻址方式给出了操作数所在数据段(还可以为附加段)的偏移量,所以寻找该操作数还需要确定操作数所在段的段首址,然后利用“物理地址=段首址16D+EA”求得操作数的物理地址。例如:MOV AX,DS:2000H ;AX(DS16+2000H)MOV CX,ES:0ABCDH ;CX(ES16+ABCDH)以上指令均采用了直接寻址方式,其中2000H、0ABCDH均为操作数的偏移量。说明:(1)当采用了直接寻址方式时,给出的直接地址前面必须给出段超越前缀,否则为非法指令,后续章节中如果指令中采用了直接寻址方式时,都必须符合该说明。(2)直接寻址方式一般可以访问数据段、堆栈段或附加段。(3)直接地址可以使用负数表示偏移量,如MOV BX,-0020H指令为合法指令,但是编译为机器码后该指令为MOV BX,FFE0H。也就是说,如果在指令中给出的直接地址是负数,则汇编过程中MASM汇编程序会对该负数进行求补。例3-4 编写一个程序,将附加段中MESS单元的字内容(3322H)送入BX寄存器。解:该程序所需要的操作数在附加段中,所以必须取得附加段的段首址,然后再根据求物理地址的公式查找该操作数。寻址过程如图3-6所示。图3-6 直接寻址源程序如下:EXTRA SEGMENTMESS DB 22H,33H ;在附加段中定义数据22H和33HEXTRA 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文件后,通过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 附加段存储数据示意图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四个寄存器,其它寄存器不允许使用。(2)寄存器的间接寻址与直接寻址方式类似,只不过寄存器的间接寻址方式是在指令中给出了存放了操作数直接地址的寄存器。(3)当采用BX、SI、DI寄存器时,操作数存放在数据段中,段寄存器采用DS;当采用BP寄存器时,操作数存放在堆栈段中,段寄存器采用SS。例3-5 编写一个程序,采用BX寄存器间接寻址方式将数据段中的0AB05H字数据送入CX寄存器。解:该题需要知道数据0AB05H所在数据段的段首址及偏移量,然后将数据的偏移量送入BX(当然也可以使用SI、DI)寄存器,然后采用寄存器间接寻址指令将BX所指向的字单元内容送CX寄存器。寻址过程如图3-9所示。图3-9 寄存器间接寻址源程序如下:DSEG 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。输入DEBUG 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编写一个程序,采用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:STACK1 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 相对寄存器寻址方式在这种寻址方式中,操作数存放在存储器中,而操作数的有效地址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)寄存器的相对寻址与寄存器的间接寻址方式类似,只不过寄存器的相对寻址方式在指令中还必须另外给出一个8位或16位位移量,与基址寄存器BX、BP或变址寄存器SI或DI的内容共同构成操作数的有效地址。(3)当采用BX、SI、DI寄存器时,操作数存放在数据段中,段寄存器采用DS;当采用BP寄存器时,操作数存放在堆栈段中,段寄存器采用SS。这一点和寄存器的间接寻址是相同的。例3-7 编写一个程序,采用SI寄存器的相对寻址方式,将数据段中以BLOCK打头的数据块的第五个字数据送入DX寄存器。解:操作数存储在数据块BLOCK中,相对于BLOCK变量来说,操作数地址还需要偏移5个字单元。所以我们将数据块BLOCK的起始地址送入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 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)这种寻址方式同样可以使用段超越前缀,以便取得其他段的数据。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采用寄存器基+变寻址方式进行实现。解:我们将数据块首地址送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,4CHINT 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+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。说明:源操作数可以是累加器、通用寄存器、段寄存器、存储单元或立即数,而目的操作数可以是累加器、通用寄存器、段寄存器(CS除外)或存储单元。在使用MOV传送指令过程中,必须注意:(1)不允许立即数作为目的操作数。(2)不允许两个操作数同时为存储器操作数。(3)类型必须匹配。即源操作数与目的操作数的数据或存放单元的长度必须一致。(4)DST和SRC不允许同时为段寄存器。(5)立即数不允许直接传送给段寄存器,一般要借助通用寄存器。(6)段寄存器CS不可作目的操作数。MOV指令可实现的传送方向如图3-18所示。图3-18 MOV指令传送方向2. MOV 指令使用形式MOV 指令可以有以下五种使用形式:(1)MOV mem/REG1 ,REG2或 MOV REG,mem其中,REG表示16位通用寄存器或8位通用寄存器。“/”表示或者的意思。mem表示存储器单元,它可以采用直接寻址方式、寄存器间接寻址、寄存器相对寻址、基+变寻址以及相对的基+变寻址方式。后面出现的REG、mem均与以上说明同,不再作出额外说明。注意:MOV指令不能实现存储单元之间的数据传送,因此两个操作数中必有一个为寄存器。而且这种格式不允许使用指令指针寄存器IP。显然,这种形式可以实现寄存器与寄存器之间、寄存器与存储器之间的数据传送。例如:MOV AH,AL ;REG1REG2MOV DS:2000H,BH ;memREGMOV BX, 0012H ;REGmem(2) MOV REG,Imm这种使用形式可以将立即数传送至16位通用寄存器或8位通用寄存器。例如:MOV AX,1234H ;REGImm16MOV AH,4CH ;REGImm8(3)MOV mem,Imm这种使用形式可以将立即数传送至存储器单元。在使用过程中应该注意两个操作数的类型必须相匹配。例如:MOV 1234H ,2000H ;直接地址前无段超越前缀 MOV BP+SI ,10H ;类型不匹配均为错误指令。第一条指令“MOV 1234H ,2000H”指令中的目的操作数采用了直接地址,但没给出段超越前缀,该指令应该添加段超越前缀,比如可以修改为“MOV DS:1234H ,2000H”即为正确指令。第二条指令“MOV BP+SI ,10H”指令中给出的源操作数为10H,该立即数可以认为是一个16位立即数0010H,也可以认为是一个8位立即数10H,那么汇编程序在汇编该语句时无法确定BP+SI所指向的单元到底是字单元还是字节单元。所以该指令应该修改为“MOV WORD PTR BP+SI ,10H”或修改为“MOV BYTE PTR BP+SI ,10H”即为正确指令。下面请读者观察这样一条指令:MOV BX+DI+1234H,5678H 该指令是正确的,因为指令给出的源操作数5678H是16位二进制数,所以目的操作数BX+DI+1234H所指向的存储器单元必定是字单元。所以该指令语句正确。下面再请读者观察这样一条指令:MOV DS:1234H,AL 该指令也是正确的,因为指令中给出的源操作数AL的位数已经确定,所以DS:1234H所指向的存储器单元必定为字节单元。(4)MOV SegReg ,mem/REG这种使用形式可以把指定的存储单元内容或寄存器的内容送到段寄存器中去,但不允许CS作为目的操作数出现。例如:MOV DS,AX ;DSAXMOV ES,DS:2000H ;ES(DS16D+2000H)MOV DS,BX+SI ;DS(DS16D +BX+SI)等指令均为合法指令。(5)MOV mem/REG ,SegReg这种使用形式可以将段寄存器内容送指定的存储单元或16位通用寄存器中。SegReg可以为DS、CS、ES和SS。例如:MOV AX,DS ;AXDSMOV DS:2000H,ES ;(DS16D+2000H)ESMOV BP+DI,SS ;(SS16D+BP+DI)SSMOV BX+SI+1000H,CS ;(DS16D+BX+SI+1000H)CS均为合法指令。3.3.2 堆栈指令堆栈指令有两条,进栈指令PUSH和出栈指令POP。堆栈指令的操作数必须为字操作数。1. 进栈指令PUSH指令格式:PUSH OPR功能:将OPR操作数(字数据)压入到堆栈的栈顶,即SPSP-2,(SP+1,SP)OPR本指令有以下三种形式:(1)PUSH REG(2)PUSH mem(3)PUSH SegReg例如:PUSH AXPUSH DS:2000HPUSH BX+SI+1000HPUSH CS均为合法指令。2. 出栈指令POP指令格式:POP DST功能:将堆栈顶端的字数据弹出到DST中,即DST(SP+1,SP)SPSP+2该指令也有如下3种形式:(1)POP REG(2)POP mem(3)POP SegReg其中,SegReg可以为DS、ES和SS,但不允许为CS。例如:POP AXPOP DS:2000HPOP BX+SI+1000HPOP ES均为合法指令。注意:PUSH和POP指令只能作字操作,因此堆栈的压入和弹出必须以字为单位,并且这两条指令不影响标志位。例3-10 分析如下指令的功能:PUSH AXPOP DX解:设AX=357AH,AX进栈前的堆栈情况如图3-19(a)所示,执行PUSH AX指令,将AX内容进栈后,堆栈情况如图3-19(b)所示,执行POP DX指令后,DX=357AH,出栈后情况如图3-19(c)所示。图3-19 堆栈变化示意图3.3.3 交换指令利用交换指令可方便地实现通用寄存器与通用寄存器或通用寄存器与存储单元之间的数据交换。指令格式: XCHG OPR1,OPR2功能:此指令把操作数OPR1的内容与操作数OPR2的内容交换。操作数同时是字节或字。例如: XCHG AL,AH XCHG SI ,BX说明:OPR1和OPR2可以是通用寄存器或存储单元。但不允许出现段寄存器,也不允许两个操作数同时为存储单元,还不允许出现立即数。该指令中可采用各种存储器寻址方式来指定存储单元,如果采用的是直接寻址方式,则必须添加段超越前缀。例如:XCHG AX,DS:2000H ;AX(DS16D+2000H)XCHG SI,ES:0020H ;SI (ES16D+0020H)均为合法指令。3.3.4 换码指令XLAT指令格式:XLAT功能:由BX和AL内容之和作为操作数的有效地址,然后将其所指向的字节存储单元的内容送入AL寄存器。即AL(DS16D +BX+AL)。在使用该指令前,应该先在存储器内建立一个字节表格,该表格的首地址事先存放在BX寄存器中,而要换的码值相对于表格首地址的偏移量事先存放到AL寄存器中,执行该指令时,由BX加AL的内容之和作为操作数的有效地址,然后将其所指向的字节单元内容替换AL原有内容,从而达到换码目的。例3-11 设数据段中有一个存储了09平方值的数据区。现在请编写一个程序求7的平方值。解:该例题可使用换码指令予以实现。我们先在数据段中定义一个09的平方值数据区,因为最大数9的平方为81,即每个数据的平方值可以使用1个字节存放。然后我们再将该数据区的首地址赋予BX寄存器,使BX寄存器指向该数据区的表头,使AL寄存器存放需要换码的数据7,执行XLAT指令,即BX+7所指向之单元内容赋予了AL寄存器。结果可从AL寄存器中查看。程序代码编写如下:DSEG SEGMENT BLOCK DB 0,1,4,9,16,25,36,49,64,81 ;定义了09的平方值DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX MOV BX,OFFSET BLOCK ;将数据区首地址赋予BX MOV AL,7 ;换码数据7赋予AL XLAT ;换码 MOV AH,4CH INT 21H ;返回DOSCSEG ENDSEND START该程序数据区存储示意图及换码过程如图3-20。图3-20 换码过程保存该文件后,通过MASM程序汇编及LINK程序后,生成111.exe文件,输入DEBUG 111.exe命令,使用U命令反汇编后,再输入“G 000D”命令执行该程序。结果如图3-21所示。图3-21 程序调试结果图3.3.5 地址传送指令8086/8088有如下三条地址传送指令。1. 指令LEA(Load Effective Address)指令LEA称为传送有效地址指令。指令格式:LEA REG,mem功能:该指令把操作数mem的有效地址(EA)传送至寄存器REG。目的操作数REG必须是一个16位的通用寄存器,而源操作数mem必须是一个存储器操作数。如果源操作数mem采用了直接寻址方式,则直接地址前必须加段超越前缀。例如:LEA AX,BUFFER ;AXBUFFER变量的偏移量LEA DX,BX+3 ;DXBX+3LEA SI,BP+DI+4 ;SIBP+DI+4LEA BX,DS:0020H ;BX0020H在第一条指令中,如果设变量BUFFER的偏移是1234H,其值为5678H,那么在执行完指令“LEA AX,BUFFER”后,AX寄存器中的值为1234H,而不是5678H,在执行完指令“MOV AX,BUFFER”后,AX寄存器中的值为5678H,而不是1234H。在第二条指令中,如果设BX=2000H,则指令执行后DX=2003H。在第三条指令中,如果设BP=2000H,DI=3000H,则指令执行后SI=5004H。在第四条指令中,指令执行后BX=0020H。注意:LEA指令中,源操作数必须为存储器操作数,不允许出现通用寄存器、段寄存器或立即数。2. 指令LDS(Load pointer into DS)指令格式:LDS REG, mem功能:该指令把mem中的一个32位数据的高字单元内容送到数据段寄存器DS,把低字单元内容送到指令给出的通用寄存器REG。源操作数mem必须是一个32位的存储器单元,操作数REG是一个16位的通用寄存器,在实际应用中,REG往往采用变址寄存器或指针寄存器。例3-12设数据段有一个双字数据为12345678H,现在有一个数据为0AAFFH,要送入数据段段首地址为1234H,偏移量为5678H单元。请使用LDS指令完成。解:根据LDS指令功能,将数据段双字内容12345678H作为一个逻辑地址(1234:5678),其中,将5678H作为偏移量送入SI寄存器,将1234H作为段首址送DS段寄存器,然后使用寄存器间接寻址方式,使数据0AAFFH存放到DS:SI所指向的内存单元。程序代码编写如下:DSEG SEGMENT POINTER1 DD 12345678H ;定义了一个双字变量内容为12345678HDSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEG START: MOV AX,DSEG MOV DS,AX LDS SI,POINTER1 ;POINTER1所指向的高字内容送DS,低字内容送SI MOV AX,0AAFFH MOV SI,AX ;DS:SIAX MOV AH,4CH INT 21H ;返回DOS CSEG ENDSEND START该程序利用了LDS指令的功能,将PONINTER1双字变量的内容改变了DS段寄存器和SI寄存器,将POINTER1所指向的高字内容1234H送DS,低字内容5678H送SI,使数据段段寄存器DS的值等于1234H,然后使用MOV SI,AX指令将0AAFFH数据送入了1234:5678所指向的字单元。该程序的操作示意如图3-22所示。 图3-22 LDS操作示意图3. 指令LES(Load pointer into ES)LES指令也传送32位地址指针。指令格式:LES REG,mem功能:该指令将mem单元的高字内容送ES寄存器,低字内容送REG16位通用寄存器,其他操作均与LDS指令相同。3.4 算术运算类指令8086/8088提供加、减、乘、除四种基本运算操作。这些操作都可用于字节或字的运算,也可以用于无符号数的运算或有符号数的运算。其中,加减运算指令对无符号数和有符号的处理一视同仁,既作为无符号数而影响标志CF和AF,也作为有符号数影响标志OF和SF,当然也会影响ZF。而乘除运算指令分为无符号数运算指令和有符号数运算指令。另外,8086/8088还提供了各种十进制运算调整指令。3.4.1 加法指令1. 加法指令ADD指令格式:ADD DST,SRC功能:该指令可以实现两个无符号数的加,并将结果送至目的操作数DST。即DSTDST+SRC。该指令有以下2种形式:(1)ADD REG1/mem,REG2 或ADD REG,mem(2)ADD REG/ mem,ImmADD指令可以实现通用寄存器之间的加法、通用寄存器与存储单元之间的加法以及通用寄存器或存储器与立即数之间的加。例如: ADD AL,AH ;寄存器之间的加 ADD AL,DS:2000H ;寄存器与存储器之间的加 ADD DI,12H ;寄存器与立即数之间的加 ADD DS:1234H,5678H ;存储单元与立即数之间的加 ADD WORD PTR DS:2000H,20H ;存储单元与立即数之间的加2. 带进位加法指令ADC指令格式:ADC DST,SRC功能:该指令与ADD指令类似,完成两个操作数相加,但还要把进位标志CF的当前值(0/1)加上去,把结果送至目的操作数DST,即DSTDST+SRC+CF。该指令有以下2种形式:(1)ADC REG/mem,REG 或ADD REG,mem(2)ADC REG/ mem,ImmADC指令可以实现带进位的通用寄存器之间的加、带进位的通用寄存器与存储单元之间的加法以及带进位的通用寄存器或存储器与立即数的加。该指令中出现的mem的表示方法和MOV指令出现的mem表示方法一致。ADC指令一般用于多字节的加法指令。尽管在8086/8088中可以进行16位运算,但16位二进制数能表达的整数的范围还是很有限的,为了扩大数的范围,仍然需要多字节运算。例如两个操作数为32位操作数时,ADD指令只能作16位的加法,所以在作高16位加法时,还需要将低16位加法的进位值CF作为加数参与到高16位加操作过程中。如图3-23所示。图3-23 多字节加法示意图由图3-23可知,32位数据相加,应该使用一次ADD指令,两次ADC指令,结果可能为一个48位数据。如果是64位数据相加,应该使用一次ADD指令,四次ADC指令,结果可能为80位数据(即10字节)。3. 自加1指令INC指令格式:INC OPR功能:操作数自加1。该指令有以下2种形式:INC REGINC mem INC指令可以实现16位(8位)通用寄存器的自加1,存储器单元内容的自加1。由于该指令为单操作数指令,所以当操作数为存储器操作数时,必须指定该存储器操作数是16位操作数还是8位操作数,即操作数是字属性还是字节属性。例如:INC AXINC SPINC BLINC BYTE PTR DS:20HINC WORD PTR ES:BX+SI+1000H小结:(1)ADD和ADC这两条指令的执行结果会影响标志位CF、SF、OF、PF、AF和ZF。(2)INC 指令执行的结果将影响AF、OF、PF、SF和ZF,但对CF不影响。(3)CF位可以用来判断无符号数的溢出,OF位可用来判断有符号的溢出。我们知道,8位二进制数可表示十进制数范围:无符号数0255,带符号数为-128+127。16位二进制数可表示十进制数范围:无符号数065535,带符号数为-32768+3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 车间蒸汽处理方案(3篇)
- DB23-T2955-2021-直播电商信用评价规范-黑龙江省
- DB23-T2922-2021-水曲柳腋芽微繁技术规程-黑龙江省
- 医院财务发票管理制度
- 国美培训时间管理制度
- 工厂保险分担方案(3篇)
- 国企公司仓库管理制度
- 别墅材料维护方案(3篇)
- 图书合作方案(3篇)
- 关于生产口罩管理制度
- 北京餐饮垃圾管理制度
- 超标准洪水应急预案
- 中外航海文化知到课后答案智慧树章节测试答案2025年春中国人民解放军海军大连舰艇学院
- 湖南省郴州市2024-2025学年七年级上学期期末历史试题(含答案)
- 心肺复苏术课件2024新版
- 健康与免疫智慧树知到答案章节测试2023年浙江中医药大学
- 超高压技术介绍、应用和工艺
- 公司治理完整测试题【附答案】
- 汽车维修工时收费标准二类企业
- 年产万吨乙酸乙酯的工艺设计
- 一鸣惊人PPT学习教案
评论
0/150
提交评论