计算机完成的任何功能,都是通过执行一系列指令来实现的,因而每种计算机都有一组指令集提供给用户使用,这组指令集合就称为计算机的指令系统。
什么是寻址方式?计算机指令中,为了取得操作数的地址(目的取得操作数的内容)而进行的寻找该操作数物理地址的方式。
计算机的大部分计算都需要数据参加,这些参加某一指令计算的数据就叫该指令的操作数。汇编语言的指令格式如下:
操作码 操作数1,操作数2,操作数3,…,操作数n
操作码:指示计算机要进行的某种指令操作,在汇编语言中,操作指令采用助记符的形式来表示操作指令,即操作码。
操作数:不同的操作码需要不同的操作数数量,大部分操作码需要的操作数不超过3个,也有的指令不需要操作数。操作数的类型也是多种多样,它可以是常数、可以是存储单元、可以是地址、甚至可以某中指令操作码等等。汇编语言中很多操作码需带有两个操作数,就把前面的操作数称为目的操作数、后面的操作数称为源操作数。
第一节 IBM PC机的寻址方式
一、与数据有关的寻址方式
(一)立即寻址方式
操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放代码段中,这种操作数叫立即数(相当高级语言的常量)。立即数可以是8位或16位数,若是16位数则高位字节存放在高地址中,低位字节存放在低地址中。这种方式如下图所示:
操作码直接对立即数进行操作。
立即寻址方式用来表示常数,它主要用于给寄存器赋初值,注意:只能用于源操作数字段,不能用于目的操作数字段。
例1 MOV AL,5
则指令执行后,(AL)=05H,8位运算
例2 MOV AX,3064H
则指令执行后,(AX)=3064H,16位运算
数据的执行过程可用下图示意:
OP表示该指令的操作码部分。
(二)寄存器寻址
操作数在寄存器,指令指定寄存器号。对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP相BP等;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL和DH。这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数,因而可以取得较高的运算速度。这种方式如下图所示:
例3 MOV AX,BX
如指令执行前(AX)=3064H,(BX)=1234H,则指令执行后,(AX)=1234H,(BX)保持不变。
除了上述两种寻址方法外,以下介绍的寻址方式的操作数都在除代码段以外的存储区中,通过不同的方式求得操作数地址,从而取得操作数。
(三)直接寻址
在IBM PC机中将操作数的偏移地址称为有效地址EA。在直接寻址方式中有效地址EA就在指令中,它存放在代码段中指令操作码之后,但操作数一般存放在数据段中,所以必须先求出操作数的物理地址,然后再访问存储器才能取得操作数,如下图所示。
如操作数在数据段中,则物理地址=16d×(DS)十EA。1BMPC机中允许数据存放在数据段以外的其他段中,此时应在指令中指定段跨越前缀,在计算物理地址时应使用指定的段寄存器。
例4 AX , [2000H]
(DS)=3000H,则执行情况如下图所示。执行结果为;(Ax)=3050H
在汇编语言指令中,可以用符号地址代替数值地址,如:
MOV AX,VALUE
此时VAIUE为存放操作数单元的符号地址。如写成
MOV AX,[VALUE]
也是可以的.两者是等效的。如果VALUE在附加段中,则应该指定段跨越前缀如下;
MOV AX, ES:VALUE
或 MOV AX, ES:[VALUE]
直接寻址方式适用于处理单个变量,例如需要处理某个存放在存储器里的变量,可用直接寻址方式,将该变量先取到一个寄存器中,然后在做处理。
IBM PC机规定:除在双操作数中,除立即数外,必须有一个操作数使用寄存器方式。这也是一个常量常常送到寄存器去的原因。
(四)寄存器间接址
操作数的有效地址在基址寄存器BX、BP或变垃寄存器SI、DI中,而操作数则在存储器中,如下图所示。
如果指令中指定的寄存器是BX、SI、DI,则操作数在数据段(DS)中,所以用DS寄存器的内容作为段地址,即操作数的物理地址为:
物理地址=16d×(DS)十(BX)
或 物理地址;16 d×(DS)十(SI)
或 物理地址=16d×(DS)十(DI)
如指令中指定SP寄存器,则操作数在堆栈段(SS)中,段地址在SS中,所以操作数的物理地址为:
物理地址=16d×(SS)十(SP)
例5 MOV AX ,[BX]
如果 (DS)=2000H , (BX)=1000H
则
物理地址=16d×(DS)十(BX) = 20000H+1000H = 21000H
执行结果见下图所示:
执行结果为:(AX)=50A0H
指令中也可指定段跨越前缀来取得其他段中的数据。如;
MOV AX,ES:[BX]
这种寻址方式可以用于表格处理,执行完一条指令后,只需要修改寄存器内容就可取出表格中的下一项。
(五)寄存器相对寻址方式
操作数的有效地址是一个基址或变址寄存器的内容和指令中指定的8位或16位位移量之和。即
同样,除有段跨越前缀者外,对于寄存器为BX、SI、DI的情况,段寄存器用DS,而寄存器BP则使用SS段寄存器的内容作为段地址。这种寻址方式示于下图。
其物理地址计算如下:
例6 MOV AX,COUNT[SI] (也可表示为MOv AX,[COUKT十SI;]
其中,COUNT 为16位位移量的符号地址。
如果(DS)=3000H,(SI)=2000H COUNT=3000H
则物理地址 = 30000十2000十3000 =35000H
指令执行情况如下图所示,执行结果是(AX)=1234H
这种寻址方式同样可用于表格处理,表格的首地址可设置为COUNT,利用修改基址
或变址寄存器的内容来取得表格中的数值。
直接变址寻址方式也可以使用段跨越前缀。
(六)基址变址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和。两个寄存器均由指令指定。如果基址寄存器为BX,段寄存器使用DS;如基址寄存器为BP时,段寄存器则用SS。因此,物理地址为:
这种寻址方式见下图:
例7 MOV AX,[BX][Dl]
(或写为: MoV AX,[DX十D1]
如 (DS)=2100H (BX)=0158H (D1)=l0A5H
则 EA=0158H十10A5H=11FDH
物理地址=2l000H十11FDH =221FDH
指令执行情况如下图所示。执行结果(AX)=1234H。
(七)相对基址变址寻址方式
操作数的有效地址是一个基址寄存器和一个变址寄存器的内容和8位或16位位移量之
和。同样,当基址寄存器为BX时,使用DS段寄存器;而当基址寄存器为BP时,则使用SS为段寄存器。因此物理地址为:
这种寻址方式参见下图:
刨8 MOV AX,MASK[BX][SI]
(也可以写成 M0V AX,MASK[DX十SI]
或 MoV AX.[MASK十BX十SI] )
如 (DS)=3000H,(BX)=2000H、(SI)=l000H,MASK=0250H,
则 物理地址=16d×(DS)十(BX)十(SI)十MASK
=30000十2000十1000十0250
=33250H
指令执行情况如下图所示。执行结果(AX)=1234H。
这种寻址方式为堆栈处理提供了方便。一般(BP)可指向栈顶,从栈顶到数组的首地址可
用位移量表示,变址寄存器可用来访问数组中的某个元索。
二、与转移地址有关的寻址方式
这种寻址方式用来确定转移指令及CALL指令的转向地址。
(一)段内直接寻址
转向的有效地址是当前IP寄存器的内容和指令中指定的8位或16位位移量之和。如下图:
这种方式的转向有效地址用相对于当前IP值的位移量来表示,所以它是一种相对寻址方式。指令中的位移量是转向的有效地址与当前IP值之差,所以当这一程序段在内存中的不同区域运行时,这种寻址方式的转移指令本身不会发生变化,这是符合程序的再定位要求的。这种寻址方式用于条件转移和无条件转移指令,但是,当它用于条件转移时,位移量只允许8位。无条件转移指令在位移量为8位时,叫短跳转。
指令的汇编语言格式为:
JMP NEAR PTR PROGIA
JMP SHORT QUEST
其中,PROGIA和QUEST均为转向的符号地址,在机器指令中,用位移量来表示。在汇编指令中,如果位移量为16位,则在符号地址前加操作符NEAR PTR。如果位移量为8位,则在符号地址前加操作符SHORT。
(二)段内间接寻址
转向有效地址是一个寄存器或是存储单元的内容,这个寄存器或存储单元的内容可以用数据寻址方式中除立即数以外的任何一种寻址方式取得,所得到的转向的有效地址用来取代IP寄存器的内容。此种寻址方式如下图所示。
注意:这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。也就是说,条件转移指令只能使用段内直接寻址的8位位移量,而JMP和CALL指令则可以使用任何跳转方式。
段内间接寻址转移指令的汇编格式可以表示为
JMP BX
JMP WORD PTR[BP+TABLE]
等。其中WORD PTR又称为操作符(伪),用以指出其后的寻址方式所取得的转向地址是一个字的有效地址,也就是说它是一种段内转移。
以上两种寻址方式均为段内转移,所以直接把求得的转移的有效地址送到IP寄存器就可以了。如果需要计算转移的物理地址,则计算公式应该是:
物理地址=l 6d×(CS)十EA
其中EA即为上述转移的有效地址。
下面举例说明在段内间接寻址方式的转移指令中,转移的有效地址的计算方法
假设: (DS)=2000H,(BX)=1256H,(SI)=528FH,
位移量=20A1H,(232F7H)=3280H,(264E5H)=2450H。
例9 JMP BX
则执行该指令后(IP)=1256H
例10 JMP TABLE[BX]
则执行该指令后(IP)=(16d×(D)十 (BX)十位移量)
=(20000十1256十20A1)
=(232F7H)
=3280H
例11 JMP [BX][SI]
则指令执行后(IP)=(16d×(DS)十(BX)十(SI))
=(20000十l256十528F)
=(264E5H)
=2450H
(三)段间直接转移
指令中直接提供了转向段地址和偏移地址,所以只要用指令中指定的偏移地址取代IP寄存器的内容,用指令中指定的段地址取代CS寄存器的内容就完成了从一个段到另一个段的转移操作,如下图所示。
这种指令的汇编语言格式可表示为:
JMP FAR PTR NEXTROUTINT
其中,NEXTROUTINT为转向的符号地址,PAR FAR 则是表示段间转移的操作符。
(四)段间间接转移
用存储器中的二个相继字的内容来取代IP和CS寄存器中的原始内容以达到段间转移约目的。这里存储单元的地址是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式取得,如下图所示。
这种指令的汇编语言格式可表示为:
JMP DWORD PTR[INTERS+BX]
其中,[INTERS+BX]说明数据寻址方式为直接变址寻址方式,DWORD PTR为双字操作符,说明转向地址需要取双字为段间转移指令。
原文始发于微信公众号(汇编语言):第三章 IBM PC 机的指令系统和寻址方式
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论