第三章汇编语言指令系统Word格式文档下载.docx
- 文档编号:16177428
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:93
- 大小:549.88KB
第三章汇编语言指令系统Word格式文档下载.docx
《第三章汇编语言指令系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第三章汇编语言指令系统Word格式文档下载.docx(93页珍藏版)》请在冰豆网上搜索。
MOVAX,CX;
双操作数指令
INCAX;
单操作数指令
NOP;
无操作数指令
8086/8088的各条指令在执行前必须转变为CPU可以识别的机器码,这是指令和伪指令之间本质的区别,因为伪指令是不会被汇编程序汇编成机器码的。
伪指令在第四章中进行介绍。
例3-1编写一段汇编程序,通过DEBUG程序的U命令查看程序中各条指令所对应的机器码。
解:
给出代码段,该代码段包含五条指令,然后通过上机观察这五条指令所对应的机器码。
程序代码编写如下:
CSEGSEGMENT
ASSUMECS:
CSEG
START:
MOVAX,0ABCDH;
AX←0ABCDH
MOVBX,1234H;
BX←1234H
MOVCX,5678H;
CX←5678H
MOVAH,4CH
INT21H;
返回DOS
CSEGENDS
ENDSTART
保存该文件,名称为111.ASM后,通过MASM程序汇编成111.OBJ,再通过LINK程序连接成111.EXE,再使用DEBUG111.EXE命令中的U查看这五条指令所对应的机器码,结果如图3-1所示。
图3-1机器码示意图
由图3-1可知,MOVAX,0ABCDH指令的机器码为B8CDAB,其中B8为该指令的操作码,CDABH表示存储器的低地址存储了0CDH,高地址存储了ABH,根据高高低低原则,该数据应该为ABCDH,很明显,该数据即为指令中的立即数OABCDH。
同理,MOVBX,1234H指令的机器码为BB3412;
MOVCX,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立即寻址方式
如果在指令中直接给出了操作数,无需再去寻找操作数了,这种寻址方式我们称为立即寻址方式。
我们把直接给出的操作数称为立即数。
立即寻址方式的特征是在指令中出现的是立即数,并且立即数是以常量形式出现的,在机器码中可以观测到该立即数。
MOVAX,1234H
MOVCX,40D
MOVAX,“a”
MOVBL,“b”
以上指令均为立即寻址方式,其中1234H、40D、字符a、字符b均为立即数,并且它们均为常量。
其中,字符a代表的是0061H立即数,而字符b代表的是62H立即数,因为它们必须符合数据类型相匹配的原则。
指令MOVAX,“a”中,目的操作数AX为16位寄存器,所以字符a自动扩展到16位。
而指令MOVBL,“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立即数寻址
源程序如下:
START:
MOVBX,0FFFFH;
立即数1234H送入BX寄存器
MOVCX,0ABCDH;
立即数0ABCDH送入CX寄存器
MOVDX,1234H;
立即数1234H送入DX寄存器
MOVAH,4CH
INT21H;
将以上程序输入完毕后保存为111.ASM文件后,通过MASM程序对其汇编,再通过LINK程序连接成111.exe。
输入DEBUG111.exe命令,使用U命令反汇编后,再输入“G000B”命令执行程序。
结果如图3-3所示。
图3-3程序调试结果图
由图3-3可知,立即数存放在代码段中。
(1)立即数只能出现在源操作数中,不能出现在目的操作数中。
(2)立即寻址方式中,立即数的位数必须与目的寄存器的位数相符合。
例如MOVAL,1234H是一条错误的指令,因为AL是8位寄存器,而1234H立即数是16位数据。
(3)立即数可以以数值形式出现,也可以以字符或字符串形式出现。
如果以字符串形式出现,则必须注意操作数的类型必须匹配。
例如MOVAX,“ab”指令也为合法指令,该指令等价于MOVAX,6162H。
而MOVAX,“abc”指令为非法指令,因为字符串“abc”的位数超过了AX寄存器的最大位数。
3.2.2寄存器寻址方式
如果操作数存储在某个寄存器中,并且以寄存器的形式出现在指令中,这种寻址方式我们称为寄存器寻址方式。
MOVAX,BX
ADDAX,CX
MOVAX,SI
以上指令均为寄存器寻址方式,操作数分别存放在BX、CX、SI中。
例3-3将立即数5577H放入寄存器AX中,再送入CX寄存器。
该程序首先采用立即寻址方式将立即数5577H送入AX寄存器,再采用寄存器寻址方式将AX的内容5577H送入CX寄存器,数据寻址方式如图3-4所示。
图3-4寄存器寻址
MOVAX,5577H;
立即数5577H送入AX
MOVCX,AX;
该指令为寄存器寻址方式,其功能为AX的内容送入CX。
输入DEBUG111.exe命令后,使用U命令反汇编后,再输入“G0007”命令执行该程序。
结果如图3-5所示。
图3-5程序调试结果图
(1)CPU访问寄存器比访问存储器快,所以使用寄存器提供操作数可提高运算速度。
(2)寄存器寻址方式中也必须注意两个操作数的类型必须相匹配。
(3)寄存器寻址方式中,源操作数可以使用8位或16位通用寄存器,还可以使用段寄存器,但是不允许使用专用寄存器IP和FR。
3.2.3直接寻址方式
如果在指令中给出操作数的偏移地址(EA),我们称这种寻址方式为直接寻址。
直接寻址方式的特征是:
在指令中给出的偏移地址EA是被方括号扩起来的一个常量。
这种寻址方式给出了操作数所在数据段(还可以为附加段)的偏移量,所以寻找该操作数还需要确定操作数所在段的段首址,然后利用“物理地址=段首址×
16D+EA”求得操作数的物理地址。
MOVAX,DS:
[2000H];
AX←(DS×
16+2000H)
MOVCX,ES:
[0ABCDH];
CX←(ES×
16+ABCDH)
以上指令均采用了直接寻址方式,其中[2000H]、[0ABCDH]均为操作数的偏移量。
说明:
(1)当采用了直接寻址方式时,给出的直接地址前面必须给出段超越前缀,否则为非法指令,后续章节中如果指令中采用了直接寻址方式时,都必须符合该说明。
(2)直接寻址方式一般可以访问数据段、堆栈段或附加段。
(3)直接地址可以使用负数表示偏移量,如MOVBX,[-0020H]指令为合法指令,但是编译为机器码后该指令为MOVBX,[FFE0H]。
也就是说,如果在指令中给出的直接地址是负数,则汇编过程中MASM汇编程序会对该负数进行求补。
例3-4编写一个程序,将附加段中MESS单元的字内容(3322H)送入BX寄存器。
该程序所需要的操作数在附加段中,所以必须取得附加段的段首址,然后再根据求物理地址的公式查找该操作数。
寻址过程如图3-6所示。
图3-6直接寻址
EXTRASEGMENT
MESSDB22H,33H;
在附加段中定义数据22H和33H
EXTRAENDS
CSEG,ES:
EXTRA
MOVAX,EXTRA;
AX←附加段首地址
MOVES,AX;
将附加段的段首址送ES寄存器
MOVBX,ES:
[0000H];
将ES:
0000单元内容送入BX寄存器
MOVAH,4CH
INT21H
该程序的MOVAX,EXTRA以及MOVES,AX这两条指令功能是将附加段的段首址送ES寄存器,即确定了附加段的段首址。
如果没有这两条指令,则系统以默认的ES值进行计算操作数的物理地址,从而会导致程序的结果出现错误。
输入DEBUG111.exe命令,使用U命令反汇编后,再输入“G000C”命令执行该程序。
结果如图3-7所示。
图3-7程序调试结果图
由图3-7可知,MOVBX,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。
MOVAX,[BX];
AX←(BX)
MOVCX,[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寄存器间接寻址
DSEGSEGMENT
MESSDB05H,0ABH;
在附加段中定义数据05H和0ABH
DSEGENDS
CSEG,DS:
DSEG
MOVAX,DSEG
MOVDS,AX;
将数据段的段首址送DS寄存器
MOVBX,OFFSETMESS;
操作数偏移地址送入了BX寄存器
MOVCX,[BX];
将BX所指向之字单元内容送CX寄存器
结果如图3-10所示。
图3-10程序调试结果图
由图3-10可知,操作数的逻辑地址应该为:
0B47:
0000,通过MOVCX,[BX]指令,我们将DS:
BX所指向的0B47:
0000字节单元的内容05H与0B47:
0001字节单元的内容0ABH送入CX寄存器,根据高高低低存储原则,CX应该为AB05H。
如果用户使用了BP作为寄存器的间接寻址,则操作数在堆栈段中,这时必须用堆栈的段寄存器SS作为段首地址,再加BP中的偏移量形成操作数的物理地址。
物理地址计算公式如下:
物理地址=SS×
16D+BP
例3-6编写一个程序,采用BP寄存器间接寻址方式将堆栈段中的1234H字数据送入DX寄存器。
该题首先需要将数据1234H送堆栈,堆栈是一块特殊区域,不能直接定义堆栈段的数据,所以我们使用PUSH指令存储数据1234H至堆栈,然后将数据所在堆栈段的段首址送SS段寄存器,数据的偏移量送BP寄存器,最后采用寄存器间接寻址指令将BX所指向的字单元内容送DX寄存器。
寻址过程如图3-11所示。
图3-11BP寄存器间接寻址
STACK1SEGMENTSTACK;
定义堆栈
VAR1dW?
;
在堆栈区定义一个保留空间
STACK1ENDS
ASSUMECS:
CSEG,SS:
STACK1
START:
MOVAX,STACK1
MOVSS,AX;
AX←堆栈段的段首址
MOVAX,1234H
PUSHAX;
压入堆栈
MOVBP,SP;
BP←堆栈的当前指针
MOVDX,[BP];
DX←BP所指向字单元
返回DOS
输入DEBUG111.exe命令,使用U命令反汇编后,再输入“G0010”命令执行该程序。
结果如图3-12所示。
图3-12程序调试结果图
3.2.5相对寄存器寻址方式
在这种寻址方式中,操作数存放在存储器中,而操作数的有效地址EA由BX、BP、SI、DI中的任意一个寄存器的内容再加上指令中给出的8位或16位位移量之和组成。
我们将这种寻址方式称为寄存器的相对。
寄存器的相对寻址方式的特征是:
在寄存器的间接寻址方式基础上,基址寄存器BX、BP或变址寄存器SI或DI再加上一个8位或16位位移量,其和构成操作数的有效地址。
MOVAX,[BX+2000H];
16D+BX+2000H)
MOVCX,[SI+12H];
CX←(DS×
16D+SI+12H)
(1)寄存器的相对寻址只能采用BX、BP、SI、DI四个寄存器,其它寄存器不允许使用。
(2)寄存器的相对寻址与寄存器的间接寻址方式类似,只不过寄存器的相对寻址方式在指令中还必须另外给出一个8位或16位位移量,与基址寄存器BX、BP或变址寄存器SI或DI的内容共同构成操作数的有效地址。
这一点和寄存器的间接寻址是相同的。
例3-7编写一个程序,采用SI寄存器的相对寻址方式,将数据段中以BLOCK打头的数据块的第五个字数据送入DX寄存器。
操作数存储在数据块BLOCK中,相对于BLOCK变量来说,操作数地址还需要偏移5个字单元。
所以我们将数据块BLOCK的起始地址送入SI寄存器后,在采用寄存器相对寻址指令时应该加上位移量8,使SI加8指向正确的操作数,然后再将该字单元的内容送DX寄存器。
寻址过程如图3-13所示。
图3-13寄存器相对寻址
BLOCKDW1234H,2345H,3456H,4567H,5678H,6789H;
定义6个数据
CSEG,DS:
MOVAX,DSEG
MOVDS,AX
MOVSI,OFFSETBLOCK;
取数据块首址赋予SI
MOVDX,[SI+8];
DX←(SI+8)
CSEGENDS
ENDSTART
该程序中数据存储如图3-14所示。
图3-14数据块BLOCK
由图3-14可知,数据5和数据1之间相差8个字节,所以SI寄存器应该加8。
保存该文件后,通过MASM程序汇编及LINK程序后,生成111.exe文件,输入DEBUG111.exe命令,使用U命令反汇编后,再输入“G000D”命令执行该程序。
结果如图3-15所示。
图3-15程序调试结果图
(1)寄存器相对寻址中,8位或16位偏移量可以为正也可以为负数。
例如MOVDX,[SI-2]指令为合法指令,其含义是SI所指向单元向低地址方向移动2字节。
(2)这种寻址方式同样可以使用段超越前缀,以便取得其他段的数据。
3.2.6基+变寻址方式
在这种寻址方式中,在指令中给出一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI),它们两者的内容之和为操作数的有效地址EA,我们将这种寻址方式称为基+变寻址方式。
这种寻址方式求操作数的物理地址有以下两种情况:
(1)如果使用了BX作为基址寄存器与SI或DI相配合,则操作数物理地址为:
PA=DS×
16D+BX+SI
或PA=DS×
16D+BX+DI
(2)如果使用了BP作为基址寄存器与SI或DI相配合,则操作数物理地址为:
PA=SS×
16D+BP+SI
或PA=SS×
16D+BP+DI
例3-8将上例3-7采用寄存器基+变寻址方式进行实现。
我们将数据块首地址送BX寄存器,操作数所在数据的偏移量8送SI寄存器,则可以达到设计要求。
寻址方式如图3-16所示。
图3-16基+变寻址方式
程序修改如下:
MOVDS,AX
MOVBX,OFFSETBLOCK;
取数据块首址赋予BX
MOVSI,0008H;
段内偏移量赋予SI
MOVDX,[BX+SI];
DX←(BX+SI)
该程序的调试结果与例题3-7的调试结果相同。
在这种寻址方式中,基址寄存器BX与BP只能选用其中的一个,变址寄存器SI、DI也只能选用其中的一个,不允许同时为基址寄存器,也不允许同时为变址寄存器。
3.2.7相对的基+变寻址方式
这种寻址方式是在基+变寻址方式的基础上再加上一个8位或16位位移量,它们三者内容之和为操作数的有效地址。
我们将这种寻址方式称为相对的基+变寻址方式。
16D+BX+SI+8(或16位)位移量
16D+BX+DI+8(或16位)位移量
16D+BP+SI+8(或16位)位移量
16D+BP+DI+8(或16位)位移量
例3-9以指令MOVAX,[BX+DI+0340H]为例,说明该种寻址方式操作过程。
设DS=2000H,BX=1500H,DI=1000H,则PA=DS×
16D+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传送指令MOV
1.指令格式
传送指令是使用得最频繁的指令。
指令格式:
MOVDST,SRC
功能:
该指令把一个字节或一个字从源操作数SRC送至目的操作数DST。
源操作数可以是累加器、通用寄存器、段
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三 汇编语言 指令系统
![提示](https://static.bdocx.com/images/bang_tan.gif)