微机原理与接口技术常用指令.docx

上传人:b****5 文档编号:11749161 上传时间:2023-03-31 格式:DOCX 页数:58 大小:179.99KB
下载 相关 举报
微机原理与接口技术常用指令.docx_第1页
第1页 / 共58页
微机原理与接口技术常用指令.docx_第2页
第2页 / 共58页
微机原理与接口技术常用指令.docx_第3页
第3页 / 共58页
微机原理与接口技术常用指令.docx_第4页
第4页 / 共58页
微机原理与接口技术常用指令.docx_第5页
第5页 / 共58页
点击查看更多>>
下载资源
资源描述

微机原理与接口技术常用指令.docx

《微机原理与接口技术常用指令.docx》由会员分享,可在线阅读,更多相关《微机原理与接口技术常用指令.docx(58页珍藏版)》请在冰豆网上搜索。

微机原理与接口技术常用指令.docx

微机原理与接口技术常用指令

微原指令

一、立即寻址方式

所提供的操作数直接包含在指令中。

它紧跟在操作码的后面,与操作码一起放在代码段区域中,如图所示。

例如:

MOVCX,2A50H

立即寻址方式的指令常用来给

寄存器赋初值。

立即数不但可

以送到寄存器中,还可以送到

一个存储单元(8位)中或两个连

续的存储单元(16位)中去。

在所有的指令中,立即数只能

作源操作数,不能作目的操作

数。

另外要注意,以A~F打头

的数字出理在指令中时,前面一定要加一个数字0,以免与其它符号相混淆。

如将立即FF00H

送到AX的指令必须写成如下形式:

MOVAX,0FF00H

二、寄存器寻址方式

在这种寻址方式下,操作数包含在寄存器中,由指令指定寄存器的名称。

对于16位操作数,寄存器可以是AX、BX、CX、DX,SI、D1、SP和BP等。

对于8位操作数,则用寄存器AH、AL、BH、BL、CH、CL、DH和DL。

例如:

MOVDX,AX

MOVCL,AH

注意:

源操作数的长度必须与目的操作数一致,否则会出错。

例如,不能将AH寄存器的内容传送到CX中去,尽管CX寄存器放得下AH的内容,但汇编程序不知道将它放到CH还是CL中。

这种寻址方式的优点是:

寄存器数量一般在几个到几十个,比存储器单元少很多,因此它的地址码短,从而缩短了指令长度,节省了程序存储空间;另一方面,从寄存器里取数比从存储器里取数的速度快得多,从而提高了指令执行速度。

三、直接寻址方式

1.直接寻址方式

在IBMPC机中,把操作数的偏移地址称为有效地址EA。

使用直接寻址方式的指令时,存储单元的有效地址直接由指令给出,在它们的机器码中,有效地址存放在代码段中指令的操作码之后。

而该地址单元中的数据总是存放在存储器中,所以必须先求出操作数的物理地址,然后再访问存储器,才能取得操作数。

当采用直接寻址指令时,如果指令中没有用前缀指明操作数存放在哪一段,则默认为使用的段寄存器为数据段寄存器DS,操作数的物理地址=16×DS+EA=10H×DS+EA。

指令中有效地址上必须加一个方括号,以便与立即数相区别。

例如:

MOVAX,[2000H]MOVAL,[2000H]

 

2.段超越前缀

如果要对代码段、堆栈段或附加段寄存器所

指出的存储区进行直接寻址,应在指令中指定段

超越前缀。

例如,数据若放在附加段中,则应在

有效地址前加“ES:

”,这里的冒号“:

”称为修改

属性运算符,计算物理地址时要用ES作基地址,

而不再是默认值DS。

例如:

MOVAX,ES:

[500H]

该指令的源操作数的物理地址等于16×ES+500H。

2.段超越前缀

如果要对代码段、堆栈段或附加段寄存器所指出的存储区进行直接寻址,应在指令中指定段超越前缀。

例如,数据若放在附加段中,则应在有效地址前加“ES:

”,这里的冒号“:

”称为修改属性运算符,计算物理地址时要用ES作基地址,而不再是默认值DS。

例如:

MOVAX,ES:

[500H]

该指令的源操作数的物理地址等于16×ES+500H。

3.符号地址

在汇编语言中还允许用符号地址代替数值地址,实际上就是给存储单元起一个名字,这样,

如果要与这些单元打交道,只要使用其名字即可,不必记住具体数值是多少。

例如:

MOVAX,AREA1

光从指令的形式上看,AREAl不仅可代表符号地址,也可以表示它是一个16位的立即数,两者之间究竟如何来区别呢?

程序中还必须事先安排说明语句也叫做伪指令来加以说明。

例如:

AREA1EQU0867H

MOVAX,AREA1

例如:

AREA1DW0867H

MOVAX,AREA1(该指令也可写为MOVAX,[AREA1])

符号地址也允许段超越,下面两条指令是等价的,即:

MOVAX,ES:

AREA1

MOVAX,ES:

[AREA1]

源操作数的物理地址=16×ES+AREA1

四、寄存器间接寻址

指令中给出的寄存器中的值不是操作数本身,而是操作数的有效地址,这种寻址方式称为寄存器间接寻址。

寄存器名称外面必须加方括号,以与寄存器寻址方式相区别。

这类指令中使用的寄存器有基址寄存器BX、BP及变址寄存器SI、DI。

如果指令中指定的寄存器是BX、SI或DI,则默认操作数存放在数据段中,这时要用数据段寄存器DS的内容作为段地址,操作数的物理地址由DS左移4位后与BX、SI或Dl相加形成。

例如:

MOVBX,[SI]

设DS=1000H,SI=2000H,(12000H)=318BH

则物理地址=16×DS+SI=10000H+2000H=12000H

如果指令中用寄存器BP进行间接寻

址,则默认操作数在堆栈段中,操作数的

段地址在寄存器SS中,操作数的物理地址

=16×SS+BP。

指令也可以指定段超越前缀来从默认

段以外的段中取得数据。

这种寻址方式一般用于访问表格,执

行完一条指令后,通过修改SI、DI、BX或

BP的内容就可访问到表格的下一数据项的

存储单元。

 

如果指令中用寄存器BP进行间接寻址,则默认操作数在堆栈段中,操作数的段地址在寄存器SS中,操作数的物理地址=16×SS+BP。

指令也可以指定段超越前缀来从默认段以外的段中取得数据。

这种寻址方式一般用于访问表格,执行完一条指令后,通过修改SI、DI、BX或BP的内容就可访问到表格的下一数据项的存储单元。

五、寄存器相对寻址方式

操作数的有效地址是一个基址或变址寄存器的内容与指令中指定的8位或16位位

移量之和。

这种寻址方式与寄存器间接寻址十分相似,主要区别是前者在有效地址上还要加一个位移量。

同样,当指令中使用BX、SI或DI寄存器时,段寄存器使用DS,当指定寄存器是BP时,段寄存器使用SS。

例如:

MOVBX,COUNT[SI]

 

 

六、基址变址寻址方式

操作数的有效地址是一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和,两个寄存器均由指令指定。

若:

基址寄存器为BX时,段址寄存器用DS

则:

物理地址=16×DS十BX十SI

或=16×DS+BX十DI

若:

基址寄存器为BP时,段址寄存器应用SS

则:

物理地址=16×SS十BP+SI

或=16×SS十BP十DI

例如:

MOVAX,[BX][SI]

设:

DS=3000H,BX=1200H,SI=0500H,(31700H)=0ABCDH

则:

物理地址=16×DS十BX十SI

=30000H+1200H+0500H

=31700H

执行结果AX=0ABCDH。

指令中的方括号有相加的意思,上述指令也可以

写成:

MOVAX,[BX+SI]

七、相对基址变址寻址方式

操作数的有效地址是一个基址寄存器和一个变址寄存器的内容,再加上指令中指定的8位或16位位移量之和。

若:

基址寄存器为BX时,用DS作段寄存器

则:

物理地址=l6×DS十BX十SI+8位或16位位移量

或=l6×DS十BX十DI+8位或16位位移量。

若:

基址寄存器为BP时,用SS作段寄存器

则:

物理地址=l6×DS十BP十SI+8位或16位位移量或=l6×DS十BP十DI+8位或16位位移量

例如:

MOVAX,MASK[BX][SI]

设:

DS=2000H,BX=1500H,SI=0300H,

MASK=0200H,(21A00H)=26BFH

则:

物理地址=16×DS+BX+SI+MASK=20000H+1500H+0300H+0200H=21A00H

执行结果,AX=26BFH。

同样,上述指令也可写成:

MOVAX,[MASK+BX+SI]

MOVAX,200H[BX+SI]

MOVAX,MASK[BX+SI]

八、其它

1.隐含寻址

指令中不指明操作数,但有隐含规定的寻址方式,例如指令DAA,它的含义是对寄存器AL中的数据进行十进制数调整,结果仍保留在AL中。

2.I/O端口寻址

8086有直接端口和间接端口两种寻址方式。

在直接端口寻址方式中,端口地址由指令直接提供,它是一个8位立即数。

由于一个8位二进制数的最大值为255,所以在这种寻址方式中,能访问的端口号为00~FFH,即256个端口。

例如:

INAL,63H

在间接寻址方式中,被寻址的端口号由寄存器DX提供,这种寻址方式能访问多达64K个I/O端口,端口号为0000~0FFFFH。

例如:

MOVDX,213H

INAL,DX

3.一条指令有几种寻址方式

上面介绍的各种寻址方式都是针对源操作数的,目的操作数均用寄存器来表示。

实际上,目的操作数也可以用除立即寻址方式以外的所有寻址方式指定,许多指令还具有各自的隐含

规则,所以一条指令可能包含几种寻址方式。

例如:

MOV[BX],AL

设:

BX=3600H,DI=1000H,AL=05H

目的操作数的物理地址=16×DS十BX=10000H十3600H=13600H

指令执行结果为(13600H)=05H。

 

1)通用传送指令MOV

可实现寄存器之间、寄存器和存储器之间传送数据,还可实现将立即数送至寄存器或存储单元的操作。

汇编格式:

MOV目的操作数,源操作数

执行的操作:

(目的操作数)←源操作数

功能:

将源操作数存入目的操作数的寄存器或存储单元中去。

注意:

①目的操作数不能是立即寻址方式。

②源操作数与目的操作数不能同时为存储器寻址方式,即两个内存单元之间不能直接传送数据。

③立即数不能直接送段寄存器,即段寄存器只能通过寄存器或存储单元传送数据。

④两个段寄存器之间不允许直接传送数据。

⑤不允许给CS、IP、PSW三个寄存器传送数据,即这3个寄存器的值用户无权改变。

⑥源操作数和目的操作数必须字长相等。

⑦MOV指令不影响标志位。

例:

DATA是用户定义的一个数据段的段名。

则:

MOVAX,DATA

MOVDS,AX

两条指令完成对DS段寄存器的赋值。

若写成:

MOVDS,DATA则是错误的。

如果把CPU内部的寄存器细分为段寄存器和寄存器的话,则MOV指令有九种形式:

①从寄存器到寄存器;②从寄存器到段寄存器;③从寄存器到存储器;④从段寄存器到寄存器;⑤从存储器到寄存器;⑥从段寄存器到存储器;⑦从存储器到段寄存器;⑧从立即数到寄存器;⑨从立即数到存储器。

MOV指令的九种形式如下图所示。

 

MOV指令的九种形式

说明:

寄存器寻址有直接、寄存器间接、寄存器相对、基址变址和相对基址变址五种存储器寻址方式。

2)进栈指令PUSH及出栈指令POP

堆栈是由若干个连续存储单元组成的“后进先出”或“先进后出”存储区域,它的段地址存于SS寄存器中,它只有一个数据出入口,堆栈指针寄存器SP任何时候都指向当前的栈顶,入栈出栈都必须通过SP来确定。

如果有数据PUSH压入或POP弹出,SP必须及时修改,以保证(SP)始终指向当前的栈顶位置。

在子程序调用和中断处理过程中,分别需要保存返回地址和断点地址,即将当前CS和IP的值压栈;在进入子程序和中断处理后,还需要保存通用寄存器的值;子程序和中断处理程序将要返回时,则要恢复通用寄存器的值;子程序和中断处理程序返回时,要将返回地址或断点地址出栈。

这些功能都要通过堆栈指令来实现。

●PUSH指令

汇编格式:

PUSH源操作数

执行的操作:

(SP)←(SP)-2先修改指针

((SP)+1,(SP))←操作数

功能:

将16位寄存器、段寄存器、16位存储单元数据压入堆栈。

●POP指令

汇编格式:

POP目的操作数

执行操作:

(操作数)←((SP)+1,(SP))

(SP)←(SP)+2后修改指针

功能:

将堆栈中的16位数据送入16位寄存器、段寄存器、16位存储单元中。

说明:

①在8086/8088中,PUSH、POP指令的操作数不能使用立即寻址方式。

POP指令的操作数还不能使用CS寄存器。

②堆栈中数据的压入、弹出必须以字为单位,所以PUSH和POP指令只能作字操作。

③这两条堆栈指令不影响标志位。

例:

MOVAX,1234H

PUSHAX

设执行前(SS)=2000H,(SP)=00FEH,指令执行过程如下图所示,执行后(SS)=2000H,(SP)=00FCH。

3)PUSHF指令。

汇编格式:

PUSHF

执行的操作:

(SP)←(SP)-2

((SP)+1,(SP))←PSW

功能:

将标志寄存器内容压入堆栈。

4)POPF指令

汇编格式:

POPF

执行的操作:

(PSW)←((SP)+1,(SP))

(SP)←(SP)+2

功能:

将16位堆栈数据弹出送入标志寄存器中。

说明:

8086/8088指令系统中没有设置改变TF标志位的指令。

若要改变TF值,先用PUSHF指令将标志压栈,然后设法改变对应TF标志位的位值,再用POPF指令弹出送给PSW,即可完成改变PSW中TF标志位的值。

例:

若想设置TF=1,程序段如下:

PUSHF

POPAX

ORAH,01H;修改TF位

PUSHAX

POPF

5)XCHG指令

互换指令XCHG可以实现字互换或字节互换。

互换可以在寄存器之间进行,也可以在寄存器和存储单元之间进行。

汇编格式:

XCHG目的操作数,源操作数

执行的操作:

互换源、目的两个操作数的存放位置。

说明:

①源、目的操作数的寻址方式不允许是立即寻址方式。

②两个寻址方式中,必须有一个是寄存器寻址,即两个存储单元之间不能直接互换数据。

③所有的段寄存器以及IP寄存器不允许使用本条指令与其他寄存器互换数据。

④此指令不影响标志位。

例XCHGBX,[BP+SI]

指令执行前,(BX)=1234H,(BP)=0100H,(SI)=0020H,(SS)=1F00H,(1F120H)=0000H,则源操作数物理地址=1F00H×10H+0100H+0020H

=1F00H×10H+0120H=1F120H

指令执行后:

(BX)=0000H,(1F120H)=1234H

3)XLAT换表指令

汇编格式:

XLAT或XLAT转换表

执行的操作:

(AL)←((BX)+(AL))

说明:

①XLAT指令是将AL的内容替换成存储单元中的一个数,往往用于代码转换,例如,把字符的扫描码转换成ASCII码或者把十六进制数0~F转换成七段数码管显示代码。

使用此指令前,先在数据段建立一个表格,表格首地址存入BX寄存器,欲取代码的表内位移量存入AL寄存器中。

XLAT指令将(AL)值扩展成16位,与(BX)相加形成一个段偏移地址,段地址取(DS),据此读出代码送入AL寄存器。

②该指令有两种格式,第二种格式中的地址标号是指代码表的表首地址。

它只是为提高程序可读性而设置的,指令执行时只使用预先存入BX中的代码表首地址,而并不用汇编格式中指定的地址标号。

③(AL)是一个8位无符号数,所以表格中最多只能存放256个代码。

④此指令的执行结果不影响标志位。

【例3-21】一个七段LED显示代码转换表存于TABLE开始的存储区,则

TABLEDB40H,79H,24H,30H,19H

DB12H,02H,78H,00H,18H

.

.

.

MOVAL,4

MOVBX,OFFSETTABLE

XLAT

完成了将4BCD码转换成七段LED显示代码的工作。

 

2.输入输出指令

这类指令都仅限于I/O端口或存储单元与累加器AL(AX)之间传送数据。

具体包括IN输入指令、OUT输出指令。

1)IN输入指令

汇编格式:

INAL,端口地址表达式或INAX,端口地址表达式

INAL,DX;端口地址存放在DX寄存器中

或INAX,DX

执行的操作:

AL←(端口地址表达式)或AX←(端口地址表达式+1),(端口地址表达式)

说明:

①该指令的目的操作数仅限于累加器,即8位操作采用AL,16位操作采用AX,不能由其他任何寄存器代替。

②如果I/O寻址的口地址号在8位以内,可以用直接寻址方式,地址表达式则由一个8位立即数表示;如果I/O寻址的口地址号在16位以内,可以用寄存器间接寻址方式,所寻址的地址口号则装入DX,间接寻址仅可以使用DX。

2)OUT输出指令

汇编格式OUT地址表达式,AL或OUT地址表达式,AX

OUTDX,AL;DX=端口地址

或OUTDX,AX

执行的操作:

端口地址←(AL)

或(端口地址+1),(端口地址)←(AX)

1)LEA取有效地址指令

汇编格式:

LEA16位寄存器名,存储器寻址方式

执行的操作:

(16位寄存器)←源操作数的偏移地址

说明:

①这条指令常用在初始化程序段中使一个寄存器成为指针。

②16位寄存器不包括段寄存器。

③这条指令不影响标志位。

例LEABX,TABLE

TABLE是数据段中定义的地址标号,指令执行前,如果(BX)=0000H,(DS)=2000H,TABLE=20020H,则指令执行后,(BX)=0020H。

2)LDS指针送指定寄存器和DS寄存器指令

汇编格式:

LDS16位寄存器名,存储器寻址方式

执行的操作:

将寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数(字)送DS寄存器。

说明:

①本条指令中的16位寄存器不允许是段寄存器。

②本条指令不影响标志位。

例LDSAX,TABLE[SI]

假设(20050H)=12345678H,指令执行前,如果(AX)=0000H,(DS)=2000H,TABLE=0020H,(SI)=0030H,则物理地址=20000H+0020H+0030H=20050H;指令执行后,(AX)=5678H,(DS)=1234H。

3)LES指针送指定寄存器和ES寄存器指令

汇编格式:

LES16位寄存器名,存储器寻址方式

执行的操作:

将寻址到的存储单元的第一个源操作数(字)送16位寄存器,第二个源操作数(字)送ES寄存器。

说明:

①16位寄存器不允许是段寄存器。

②本条指令不影响标志位。

4.标志传送指令

这组指令包括LAHF标志送AH和SAHFAH送标志寄存器。

1)LAHF标志送AH指令

汇编格式:

LAHF

执行的操作:

(AH)←(PSW的低8位)

说明:

此指令具体操作如下图所示。

2)SAHFAH送标志寄存器指令

汇编格式:

SAHF

执行的操作:

(PSW的低8位)←(AH)

3.3.2 算术运算指令

算术运算指令包括二进制数的运算及十进制数的运算指令。

算术运算指令用来执行加、减、乘、除算术运算,它们有双操作数指令,也有单操作数指令,单操作数指令不允许使用立即寻址方式。

乘法和除法指令的目的操作数采用隐含寻址方式,汇编指令只指定源操作数,源操作数不允许使用立即寻址方式。

双操作数指令不允许目的操作数为立即寻址,不允许两个操作数同时为存储器寻址。

另外,不论是双操作数还是单操作数,都不允许使用段寄存器。

段寄存器只能被传送、压栈、出栈。

特别要强调的是,当汇编程序无法确定指令中操作数的长度时,必须用BYTEPTR、WORDPTR、DWORDPTR伪指令来指定操作数的长度。

1)ADD加法指令

汇编格式:

ADD目的操作数,源操作数

执行的操作:

(目的操作数)←源操作数+目的操作数

2)ADC带进位加法指令

汇编格式:

ADC目的操作数,源操作数

执行的操作:

(目的操作数)←源操作数+目的操作数+CF

3)INC增量指令

汇编格式:

INC操作数

执行的操作:

(操作数)←操作数+1

以上三条指令都可作字或字节运算,除INC指令不影响CF标志位外,其他标志位都受指令操作结果的影响。

PSW中的标志位共有9位,其中最主要的是ZF、SF、CF、OF四位。

ZF表示结果是否为零,SF表示结果的符号位,CF表示最高有效位是否有向更高位的进位,OF表示结果是否溢出。

对加法指令来讲,如果操作数是无符号数,则最高有效位有向更高位的进位说明运算结果超出了机器位数所能表示的最大数。

因此,CF标志位实质上是表示无符号数有无溢出。

而OF标志位表示有符号数有无溢出。

例:

完成双字长相加,被加数存放在DX与AX中,加数放在BX与CX中,和放在DX与AX中。

程序段如下:

ADDAX,CX

ADCDX,BX;高位运算时要考虑低位的进位

1)SUB减法指令

汇编格式:

SUB目的操作数,源操作数

执行的操作:

(目的操作数)←目的操作数-源操作数

2)SBB带借位减法指令

汇编格式:

SBB目的操作数,源操作数

执行的操作:

(目的操作数)←目的操作数-源操作数-CF

3)DEC减量指令

汇编格式:

DEC操作数

执行的操作:

(操作数)←操作数-1

4)NEG求补指令

汇编格式:

NEG操作数

执行的操作:

(操作数)←0-操作数

说明:

①0-操作数=-操作数,在微型计算机中,带符号的二进制数值数据都采用补码编码,因此,此处的操作数是补码,所以求负的操作数实质上是求补操作。

②只有当操作数为0时求补运算的结果使CF=0,其他情况则均为1;只有当操作数为-128或-32768时使OF=1,其他情况则均为0

5)CMP比较指令

汇编格式:

CMP目的操作数,源操作数

执行的操作:

目的操作数-源操作数。

说明:

本条指令相减结果不保存,只是根据结果设置标志位。

在实际应用中,CMP指令后往往跟着一个条件转移指令,根据比较结果产生不同的分支。

以上五条指令都可作字或字节运算。

另外,除DEC指令不影响CF标志位外,其他指令都对标志位有影响。

减法指令对标志位的影响与加法指令类似,所不同的是CF位。

前面说过,CF表示机器的最高有效位有向更高位的进位。

对减法指令来讲,恰好相反,若机器最高有效位没有向更高位的进位时,CF=1,否则CF=0。

对用户来讲,减数大于被减数,此时有借位则CF=1,否则CF=0。

例:

完成双字长相减操作,被减数存放在DX与AX中,减数存放在BX与CX中,差放在DX和AX中。

程序段如下:

SUBAX,CX

SBBDX,BX

3.乘法指令

乘法指令可对字节、字进行操作,且可对有符号数整数或无符号数整数进行操作。

两个8位数相乘,结果为16位数;两个16位数相乘,结果为32位数。

乘法指令有两条。

1)MUL无符号数乘法指令

汇编格式:

MUL源操作数

执行的操作:

若为字节操作(AX)←(AL)×源操作数

若为字操作(DX),(AX)←(AX)×源操作数

2)IMUL有符号数乘法指令

汇编格式:

IMUL源操作数

执行的操作:

与MUL相同,只是处理的数据是有符号数,而MUL处理的数据是无符号数。

说明:

①在乘法指令中,被乘数(即目的操作数)隐含在AX(字运算)或AL(字节运算)中,乘数(即源操作数)由指令寻址,其寻址方式可以是除立即寻址方式之外的任何数据寻址方式,它同时也决定了乘法是字运算还是字节运算。

两个8位数相乘其积是16位,存放在AX中;两个16位数相乘其积是32位,存放在DX、AX中,DX存放高位字,AX存放低位字。

②乘法指令对除CF和OF以外的标志位无定义(即这些标志位的状态是不定的)

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

当前位置:首页 > 人文社科 > 法律资料

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

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