资源描述
十六位微机原理及接口技术 第7页
指令格式及寻址方式
§4-1-1 8086/8088的通用指令格式
机器语言指令是由二进制代码组成。一条指令是由操作码与操作数字段构成,其一般格式为:操作码字段 + 操作数字段。
操作码字段指明计算机所要执行的操作(即功能);
操作数字段指出在指令执行过程中所需要的操作数。
比如指令指明作加法,则操作数就是加数,而且有两个。计算机的任何操作不容有模糊的地方。指令中的操作数同样如此,指令中不仅要指出有几个操作数,还要指明每个操作数到底在什么地方。
例如:ADD AX, BX
其中ADD 是操作码助记符,指明做加法运算:AX和BX 是操作数助记符,指出被加数和加数,AX 还存放相加后的结果(原来被加数被冲掉)。
对有操作数的指令,在执行指令所规定的操作之前首先要寻找操作数。操作数可放在CPU寄存器中,或内存单元中,或I/O端口内,寻找这些操作数的方式称为寻址方式,即指令中用于说明操作数或操作数所在地址的方法。
汇编语言是一种很接近于机器语言的低级计算机语言,在汇编语言中,助记符代替了操作码,而操作数部分也象机器语言一样需要指明具体位置,具有机器语言相应的寻址方式,当然表现形式不是二进制符号,而是数值、寄存器名、变量等。
为了更好的理解和掌握寻址方式及其用法,先对后面例子中使用的一条汇编语言指令做简单说明。MOV指令是汇编语言最常用的指令之一,指令的基本格式是:
MOV d1,d2
该指令的功能是把操作数d2的值(如果在内存或寄存器中则取出它的值)传送到操作数d1指明的地方,相当于高级语言中的赋值语句功能。操作数d1的寻址方式可以是内存型,也可以是寄存器型,但不能是立即数。
汇编语言的指令根据所带有的操作数的数量分为无操作数指令、单操作数指令、双操作数指令三类。MOV等双操作数指令中绝大多数都是把写在前面的操作数d1作为存放操作结果的目的地,所以称为目的操作数,而d2称为源操作数。
§4-1-2 立即寻址(立即数)
特点:操作数直接存放在指令中,作为指令的一部分存放在代码段里,这种操作数称为立即寻址。操作数可以是各种数制下的数。
一般常用于给寄存器或存储单元赋初值(即初始化),立即数只能用于源操作数字段,不能用于目的操作数字段 。
例4-1: MOV AX,5 ;(AX)← 5 十进制形式的立即数
MOV AX,1234H ;(AX)← 1234H 十六进制形式的立即数
MOV AL,11001101B ;(AL)← 11001101B 二进制形式的立即数
MOV AL,’3’ ;(AL)← 33H 字符形式的立即数
立即数还有一些比较复杂的情况。如果操作数是由数值和运算符构成的表达式,汇编程序在翻译时会计算出表达式的值,并把结果以立即数形式翻译到机器指令中。比如:
MOV AL,’3’-30H ;表达式计算结果是3,并以3作为立即寻址方式的操作数。
MOV 200H,AX ;(错误的,立即数不能作目的操作数)
立即数可是二进制、十进制、十六进制。
§4-1-3 寄存器寻址
特点:操作数在某寄存器中,存取这类操作数在CPU内部进行,所以执行速度快。
存放16位操作数的寄存器有:AX,BX,CX,DX,BP,SP,SI,DI;
存放8位操作数的寄存器有: AH,AL,BH,CH,CL,DH,DL。
CS、DS、SS、ES---------16位的段寄存器
例4-2:以知:(BX)=1234H
MOV AX,BX ;(AX)←(BX)
执行后(AX)=1234H,(BX)不变。
下面指令中的操作数都是寄存器寻址方式
MOV AL,BL MOV AL,DH MOV BP,SP MOV AX,SI MOV AX,CS MOV DS,DX
注意:指令指针IP和标志寄存器PSW以及所有标志位的代号CF、ZF、OF等都不能作为寄存器寻址方式的操作数,不允许出现在汇编语言的任何指令中。另外,,8088汇编语言还规定,不允许用MOV等具有赋值功能的指令修改CS的值,在8088汇编语言中MOV CS, AX不符合语法规则。
§4-1-4 存储器操作数寻址
内存型寻址方式是指参与操作的数据在内存中,因此必须指明操作数究竟在内存的什么地方,即指出内存的逻辑地址。存储器是分段管理的,要找到操作数,必须指明操作数所在的段(段基址由段寄存器指明)及段内偏移地址(以有效地址EA的形成方式指出)。
1. 直接寻址方式
特点:指令中指接给出操作数在段内的偏移量,段基址隐含给出或用段前缀指明。该寻址方式适用于处理单个变量。
一般操作数存放在数据段,故操作数的物理地址为:
物理地址=(DS)× 16 + EA
=(段基址的寄存器)× 16 + 偏移地址
例 4-3:以知:(DS)=4000H,[1000H]=3355H
MOV AX,[2000H]
执行后:(AX)=3355H
物理地址=40000H+1000H=41000H EA=1000H,寻址过程如图4-1所示。
存储器
…
00
20
…
55
33
…
代码段
数据段
AX
33
55
41000H
图4-1 例4-3直接寻址示意图
说明:
(1) 偏移地址(EA)在指令中直接给出。指令中缺省段寄存器说明,段基址在DS段寄存器中;否则在指令中需对段寄存器加以说明。
例如:MOV AX,ES:[2300H]
(2) 可用符号地址代替数值地址,例如:MOV AX,VALUE ;此时,VALUE 为存放操作数单元的符号地址,即变量名,也可写成:MOV AX,[VALUE];两者等价。
2. 寄存器间接寻址
特点:操作数有效地址在基址寄存器BP、DI中,而操作数则在存储器中。它适用于表格处理,执行完一条指令后,只需修改寄存器内容就可取出表格中的下一项元素。
(1) 令中的有效地址(EA)存放在BX,SI,DI寄存器中,则操作数在数据段中,
即操作数的物理地址为:
(BX)
物理地址=16D×(DS)+ (SI)
(DI)
(2) 若有效地址存放在BP寄存器,则操作数在堆栈段中,即操作数物理地址为:
物理地址=(SS)16+(BP)
(3) 可使用段跨越前缀来取得其他段中的数据,如:
MOV AX,ES:[BX]
注意:MOV AX,BX; (AX)← (BX)与上面的 MOV AX,[BX]含义不同。
例4-4:已知:(DS)=1000H,(BX)=0A00H
MOV AX,[BX]
物理地址=10000H+0A00H=10A00H
执行后:(AX)=4422H ,如图4-2所示。
存储器
…
OP
××
…
…
22
44
…
代码段
数据段
10000H
AX
44
22
DS+BX
10A00H `
图4-2 例4-4寄存器间接寻址示意图
3. 寄存器相对寻址
其特点:操作数的有效地址是一个基址寄存器或变址寄存器的内容和指令中指定的8位或16位位移量(即偏移量)之和。适用于表格处理,修改基址或变址寄存器的内容来取得表格中的元素。一般形式:
(BX)
物理地址=16D ×(DS)+ (SI) + 8位位移量或16位位移量
(DI)
物理地址=(SS)×16D+(BP)+8位位移量或16位位移量
例4-5:已知(DS)=2000H,(SI)=50H,其中DISP为16位位移量的符号地址,其值DISP=1000H。
MOV AX,DISP[SI]
或 NOV AX,[DISP+SI]
物理地址=20000+1000H+50H=21050H
执行后:(AX)=6688H,如图4-3所示。
该寻址方式可使用段跨越前缀,例如:MOV DL,ES:STRING[SI]
存储器
…
OP
OP
00
30
…
…
88
66
…
代码段
SI
数据段
`
20000H
DISP
AX 21000H
66
88
21050H
图4-3 例4-5寄存器相对寻址示意图
4. 基址变址寻址
特点:操作数的有效地址是一个基址寄存器的一个变址寄存器内容之和。
(SI)
物理地址=(DS)×16D+(BX)+
(DI)
SI)
物理地址=(SS)×16D+(BP )+
(DI)
适用表格或数组处理,表格或数组首地址可存放在基址寄存器中。
例4-6:已知:(DS)=3000H,(BX)=1100H,(SI)=0050H
MOV AX,[BX][DI]
或 MOV AX,[BI+DI]
EA=1100H+0050H=1150H
物理地址=30000H+1150H=31150H
执行后:(AX)=5678H
5. 相对基址变址寻址
特点:操作数据有效地址是一个基址寄存器与一个变址寄存器的内容之和再加上8位或16位位移量。同样,当基址寄存器为BX时,使用DS为段寄存器;而当基址寄存器为BP时,则使用SS为段寄存器。因此物理地址为:
(SI) 8位
物理地址=(DS)×16D+(BX)+ + 位移量
(DI) 16位
(SI) 8位
物理地址=(SS)×16D+(BP)+ + 位移量
(DI) 16位
例4-7:已知(DS)=5000H,(BX)=3000H,(SI)=2000H,BUFF=0350H
MOV AX,BUFF[SI][BX]
或 MOV AX,[BUFF][BX][SI]
或 MOV AX,[BUFF+SI+BX]
物理地址=(DS)×16D+(BX)+(SI)+BUFF
=50000H+3000+2000+0305=55350H
执行后:(AX)=6684H,如图4-5。
该寻址方式为堆栈和多重表格处理提供了方便,无段跨越前缀。
§4-1-5 I/O端口寻址
1. 直接端口寻址方式
I/O端口地址以8位立即数方式在指令中直接给出.
例如 IN AL,PORT; PORT为寻址端口编号,只能在0~255范围之内.
2. 间接端口寻址方式
I/O地址超过8位时,应放在DX寄存器中,即通过DX间接寻址,所能寻址的端口编号为0~65535。如 OUT DX,AL,表示将AL的内容输出到由(DX)指出的端口中去。
在16位PC机中,仅用A9~A0 十条地址线表示I/O端口,所以DX间接寻址的范围为0~1023(即0~3FFH)。
本节小结
本节介绍了微型计算机的指令格式、寻址方式。通过本节学习,读者应该熟悉指令的格式,了解指令中各字段的功能;掌握各种寻址方式极其应用,学会有效地址的计算方法;
练习
1、 给定BX=874EH,SI=2A9B,位移量DISP=8117H,试确定在以下各寻址方式下的有效地址是什么?
(1) 立即寻址 (无)
(2) 直接寻址 (8117)
(3) 使用BX的寄存器寻址 (无)
(4) 使用BX的寄存器间接寻址 (874EH)
2、 假定DS=4000H,ES=4100H,SS=3500H,SI=00B0H,BX=0200H,BP=0020H,VAL=0100H,试指出以下源操作数字段的寻址方式是什么?其物理地址是什么?
(1) MOV AX,0BCH 立即 无
(2) MOV AX,BX 寄存器 无
(3) MOV AX,[200H] 直接寻址 (DS)X16+200H
(4) MOV AX,VAL 直接寻址 (DS)X16+0100H
(5) MOV AX,[BX] 寄存器间接寻址 (DS)X16+0200H
(6) MOV AX,ES:[BX] 寄存器间接寻址 (ES)X16+0200H
(7) MOV AX,[BP] 寄存器间接寻址 (SS)X16+0200H
(8) MOV AX,[SI] 寄存器间接寻址 (DS)X16+0200H
(9) MOV AX,[BX+06H] (10)MOV AX,VAL[BX]
(11) MOV AX,[BX][SI] (12)MOV AX,VAL[BX+SI]
3、 现有DS=4000H, BX=0300H, SI=0002H, (40300H)=01H, (40301H)=23H, (40302H)=45H,(40303H)=67H,(41400H)=3BH,(41401H)=7EH,(41402H)=C2H,(41403H)=56H,试指出下列各条指令执行完毕后AX寄存器的内容。
(1) MOV AX,1400H 1200H
(2) MOV AX,BX 0300H
(3) MOV AX,[1400H] 40000+1400=41400 7E3BH
(4) MOV AX,[BX] 40000+0300=40300 2301H
(5) MOV AX,1100[BX] 40000+0300+1100=41400 7E3BH
(6) MOV AX,[BX][SI] 40000+0300+0002=40302 6745H
(7) MOV AX,1100[BX+SI] 40000+0300+0002+1100=41402 56C2H
展开阅读全文