8086寻址方式
时间:11-27
来源:互联网
点击:
BTW--符号的说明:
PA 表示某一存储单元的物理地址
EA 表示某一存储单元的有效地址
(地址) 表示地址的内容
[地址] 表示地址的内容为偏移地址
DEST 表示目的地址,即目的操作数存放的偏移地址
SOUR 表示源地址,即源操作数存放的偏移地址
- 表示传送。如:(AX)-BX表示把AX的内容传送给BX
? 逻辑与
? 逻辑或
⊕ 逻辑异或
---- 上划线表示逻辑非
____ 下划线表示从键盘输入
或者
Flags 表示状态寄存器
8086和8088 CPU就功能而言可分成两大部分:总线接口单元BIU(Bus Inte***ce Unit)和执行单元EU(Execution Unit)
EU主要实现两种操作:一是根据指令进行算术逻辑运算。二是由计算出指令要求寻址单元地址偏移量,以形成一个20位物理地址,去存取器存取所要求的操作数。
BIU主要负责80868088 CPU与存储器和外设之间的信息传送,BIU用来实现EU所有总线操作。
在EU执行指令的过程中,BIU负责从内存指定区域取出传送给EU部分去执行。在执行指令时,所需的操作数也是由BIU从内存指定区域取出传送给EU部分执行。
与数据有关的寻址方式
1 立即寻址方式(Immediate addressing)
立即数可以是8位的或16位的。如果是16 位数,则高位字节存放在高地址中,低位字节存放在低地址中,如果是32 位数,则高位字在高地址中,低位字在低地址中。
立即寻址方式常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段。
例 MOV AL, 9
指令执行后,(AL)= 09H
例 MOV AX, 3064H
指令执行后,(AX)= 3064H
注意:不能直接给段寄存器和标志寄存器赋予立即数。
显然,下面的指令是错误的:
MOV DS, 1250H
2 寄存器寻址方式(Register addressing)
对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES和SS;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL、DH。由于操作数就在寄存器中,指令执行时不需要访问存储器,因此这是一种快速的寻址方式。
例 MOV AX, BX
如指令执行前(AX)= 1234H,(BX)= 5678H;
则指令执行后(AX)= 5678H,(BX)保持不变。
注意:源寄存器和目的寄存器的位数必须一致。
例如:MOV CL, BX是一条错误指令。
除上述两种寻址方式外,下面五种寻址方式的操作数都在除代码段以外的存储区中。
这里先引入有效地址EA(Effective Address)的概念:在8086里,把操作数的偏移地址称为有效地址,下面五种计算EA的方法体现了五种寻址方式。
3 直接寻址方式(Direct addressing)
在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地址就在指令的操作码之后,操作数的物理地址可通过((DS)×16)再加上这个有效地址形成。
在汇编语言指令中,可以用符号地址(变量名或标号)代替数值地址。
例如: MOV AX, DATA
或 MOV AX, [DATA]
这里DATA是存放操作数单元的符号地址。
直接寻址方式默认操作数在数据段中,如果操作数定义在其它段中,则应在指令中指定段跨越前缀。
例如: MOV AX, ES:NUMBER
或 MOV AX, ES:[NUMBER]
这里NUMBER是附加段中的字变量。
直接寻址方式适合于处理单个变量。
例 MOV AX, [2000H]
如果(DS)= 3000H,则执行情况如图3.2所示。
最后的执行结果为(AX)= 3050H。
4 寄存器相对寻址方式(Register indirect addressing)
这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS。
寄存器相对寻址方式也可以使用段跨越前缀。
例如:MOV AX, ES:[DI+10]
这种寻址方式同样可用于表格处理。
表格的首地址可设置为位移量,修改基址或变址寄存器的内容取得表格中的值。
例 MOV AX, COUNT[SI](也可表示为MOV AX, [COUNT+SI])
其中COUNT为16位位移量的符号地址。
如果 (DS)= 3000H,(SI)= 2000H,COUNT = 3000H
则物理地址 = 30000H + 2000H + 3000H = 35000H
指令执行情况如图3.4所示,最后的执行结果是(AX)= 1234H。
5 基址变址寻址方式(Based indexed addressing)
这是一种基址加变址来定位操作数地址的方式,也就是说,操作数的有效地址是一个基址寄存器(BP或BX)和一个变址寄存器(SI或DI)的内容之和。如基址寄存器为BX时,与DS形成的物理地址指向数据段;如基址寄存器为BP时,与SS形成的物理地址指向堆栈段。如左图所示。
此种寻址方式也可使用段跨越前缀。
例如:MOV AX, ES:[BX][SI]
注意:一条指令中同时使用基址寄存器或变址寄存器是错误的。
例如:MOV CL, [BX+BP] 或 MOV AX, [SI+DI] 均为非法指令。
这种寻址方式同样适用于数组或表格处理。
首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器的值都可以修改,所以它比寄存器相对寻址方式更加灵活。
例 MOV AX, [BX][DI] (或写为 MOV AX, [BX+DI])
如 (DS ) = 2100H,(BX)= 0158H,(DI)= 10A5H
则 EA = 0158H +10A5H = 11FDH
物理地址 = 21000H +11FDH = 221FDH
指令执行情况如图3.5所示,最后的执行结果是(AX)= 1234H。
6 相对基址变址寻址方式(Relative based indexed addressing)
这种寻址方式与基址变址寻址方式类似,不同的是基址加变址再加上一个位移量形成操作数的有效地址。缺省段的使用仍然是DS与BX组合,SS与BP组合。
这种寻址方式通常用于对二维数组的寻址。
例如,存储器中存放着由多个记录组成的文件,则位移量可指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素。
这种寻址方式也为堆栈处理提供了方便。
一般(BP)可指向栈顶,从栈顶到数组的首址可用位移量表示,变址寄存器可用来访问数组中的某个元素。
综上所述,有效地址可以由以下三种成分组成:
· 位移量(Displacement)是存放在指令中的一个8位或16位数,但它不是立即数,而是一个地址。
· 基址(Base)是存放在基址寄存器(BX或BP)中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
· 变址(Index)是存放在变址寄存器(SI或DI)中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。
有效地址的计算可用下式表示:
EA = 基址 + 变址 + 位移量
这三种成分都可正可负,以保证指针移动的灵活性。它们任意组合使用,可得到不同的寻址方式。
例 MOV AX, MASK[BX][SI]
(或 MOV AX, MASK[BX+SI],或 MOV AX, [MASK+BX+SI])
如(DS)= 3000H,(BX)= 2000H,(SI)= 1000H,MASK = 0250H,
则物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H
指令执行情况如图3.6所示,最后的执行结果是(AX)= 1234H。
与转移地址有关的寻址方式
前面的与数据有关的寻址方式最终确定的是一个数据的地址,而这里的与转移地址有关的寻址方式最终确定一条指令的地址。顺序执行的指令地址是由指令指针寄存器IP自动增量形成的,而程序转移的地址必须由转移类指令和CALL指令指出,这类指令表示转向地址的寻址方式包括:段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址。
三个表示转移距离(称为位移量)的操作符:SHORT、NEA*、**R。
SHORT表示位移量在-128~127字节之间。
NEA*表示在同一段内转移,位移量在-32768~32767字节范围内。
**R表示转移距离超过±32K字节,或是在不同段之间转移。
因为CS:IP寄存器总是指向下一条将要执行的指令的首地址(称为IP当前值),当转移指令执行后,必须修改IP或CS、IP的值。当转移指令给出位移量时,用IP当前值加上位移量即为新的IP的值。
SHORT转移,称为短转移,位移量用一个字节(8位)来表示。
NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码段,所以只修改IP的值,CS的值不变。
FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必须修改为新的值。
与转移地址有关的4种寻址方式就是告诉CPU如何修改CS和IP的值,以达到控制程序转移的目的。
1 段内直接寻址(Intrasegment direct addressing)
这种寻址方式在指令中直接指出转向地址,如:
JMP SHORT NEXT
JMP NEAR PTR AGAIN
其中,NEXT和AGAIN均为转向的符号地址。在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。
注意:这种寻址方式适用于条件转移及无条件转移指令,当用于条件转移指令时,位移量只允许8位。
例 段内直接寻址方式
1060:000D EB04 JMP SHORT NEXT
IP当前值→ 1060:000F … …
1060:0011 … …
1060:0013 0207 NEXT: ADD AL,[BX]
CPU在执行JMP指令时,IP指向了下一条指令,其值为000F,JMP SHORT NEXT指令的机器语言为EB04,EB为操作码,04为位移量,所以转向的有效地址应为:
000F + 0004 = 0013
0013正是标号NEXT的地址。JMP指令执行后,将IP寄存器修改为0013,代码段寄存器CS不变。紧接着CPU根据CS:IP的指示,取出1060:0013中的ADD指令开始执行,这样实现了程序的转移。
2 段内间接寻址(Intrasegment indirect addressing)
这种寻址方式在指令中用数据寻址方式(除立即寻址方式外)间接地指出转向地址,如:
JMP BX
JMP NEAR PTR [BX]
JMP TABLE[SI]
根据指令中的寻址方式,确定一个寄存器或一个存储单元,其内容就是指定转向的有效地址。因为程序的转移仍在同一段内进行,所以只需将IP修改成新的转向地址,CS不变。段内转移指令中的NEAR PTR是可以缺省的。
注意:这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。
条件转移指令只能使用段内直接寻址的8位位移量,而JMP和CALL指令则可用四种寻址方式中的任何一种。
假设: (DS)= 2000H,(BX)= 1256H,(SI)= 528FH,
位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。
例 JMP BX
则执行该指令后(IP)= 1256H
例 JMP [BX][SI]
则指令执行后(IP)=(16d ×(DS)+(BX)+(SI))
=(20000H + 1256H + 528FH)
=(264E5H)
= 2450H
3 段间直接寻址(Intersegment direct addressing)
段间直接寻址和段内直接寻址类似,指令中直接给出转向地址,不同的是,在符号地址之前要加上表示段间远转移的 操作符FAR PTR。
指令格式如下:
JMP FAR PTR OUTSEG
因为是段间转移,CS和IP都要更新,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的转向偏移地址装入IP,转向段地址装入CS,就完成了从一个段到另一个段转移的工作。
4 段间间接寻址(Intersegment indirect addressing)
这种寻址方式仍然是用相继两个字的内容装入IP和CS来达到段间的转移目的的,但这两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的。
为了说明寻址两个字单元,指令中必须加上双字操作符DWORD。指令格式如下:
JMP DWORD PTR [SI]
JMP DWORD PTR[TABLE+BX]
PA
EA
(地址)
[地址]
DEST
SOUR
-
?
?
⊕
----
____
Flags
在EU执行指令的过程中,BIU负责从内存指定区域取出传送给EU部分去执行。在执行指令时,所需的操作数也是由BIU从内存指定区域取出传送给EU部分执行。
1 立即寻址方式(Immediate addressing)
立即寻址方式常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的操作数字段。
指令执行后,(AL)= 09H
指令执行后,(AX)= 3064H
注意:不能直接给段寄存器和标志寄存器赋予立即数。
显然,下面的指令是错误的:
MOV DS, 1250H
2 寄存器寻址方式(Register addressing)
对于16位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES和SS;对于8位操作数,寄存器可以是AL、AH、BL、BH、CL、CH、DL、DH。由于操作数就在寄存器中,指令执行时不需要访问存储器,因此这是一种快速的寻址方式。
如指令执行前(AX)= 1234H,(BX)= 5678H;
则指令执行后(AX)= 5678H,(BX)保持不变。
注意:源寄存器和目的寄存器的位数必须一致。
例如:MOV CL, BX是一条错误指令。
除上述两种寻址方式外,下面五种寻址方式的操作数都在除代码段以外的存储区中。
这里先引入有效地址EA(Effective Address)的概念:在8086里,把操作数的偏移地址称为有效地址,下面五种计算EA的方法体现了五种寻址方式。
3 直接寻址方式(Direct addressing)
在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地址就在指令的操作码之后,操作数的物理地址可通过((DS)×16)再加上这个有效地址形成。
在汇编语言指令中,可以用符号地址(变量名或标号)代替数值地址。
例如: MOV AX, DATA
或 MOV AX, [DATA]
这里DATA是存放操作数单元的符号地址。
直接寻址方式默认操作数在数据段中,如果操作数定义在其它段中,则应在指令中指定段跨越前缀。
例如: MOV AX, ES:NUMBER
或 MOV AX, ES:[NUMBER]
这里NUMBER是附加段中的字变量。
直接寻址方式适合于处理单个变量。
如果(DS)= 3000H,则执行情况如图3.2所示。
最后的执行结果为(AX)= 3050H。
4 寄存器相对寻址方式(Register indirect addressing)
这种寻址方式通过基址寄存器BX、BP或变址寄存器SI、DI与一个位移量相加形成有效地址,计算物理地址的缺省段仍然是SI、DI和BX为DS,BP为SS。
寄存器相对寻址方式也可以使用段跨越前缀。
例如:MOV AX, ES:[DI+10]
这种寻址方式同样可用于表格处理。
表格的首地址可设置为位移量,修改基址或变址寄存器的内容取得表格中的值。
其中COUNT为16位位移量的符号地址。
如果 (DS)= 3000H,(SI)= 2000H,COUNT = 3000H
则物理地址 = 30000H + 2000H + 3000H = 35000H
指令执行情况如图3.4所示,最后的执行结果是(AX)= 1234H。
5 基址变址寻址方式(Based indexed addressing)
这是一种基址加变址来定位操作数地址的方式,也就是说,操作数的有效地址是一个基址寄存器(BP或BX)和一个变址寄存器(SI或DI)的内容之和。如基址寄存器为BX时,与DS形成的物理地址指向数据段;如基址寄存器为BP时,与SS形成的物理地址指向堆栈段。如左图所示。
此种寻址方式也可使用段跨越前缀。
例如:MOV AX, ES:[BX][SI]
注意:一条指令中同时使用基址寄存器或变址寄存器是错误的。
例如:MOV CL, [BX+BP] 或 MOV AX, [SI+DI] 均为非法指令。
这种寻址方式同样适用于数组或表格处理。
首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。由于两个寄存器的值都可以修改,所以它比寄存器相对寻址方式更加灵活。
如 (DS ) = 2100H,(BX)= 0158H,(DI)= 10A5H
则 EA = 0158H +10A5H = 11FDH
物理地址 = 21000H +11FDH = 221FDH
指令执行情况如图3.5所示,最后的执行结果是(AX)= 1234H。
6 相对基址变址寻址方式(Relative based indexed addressing)
这种寻址方式与基址变址寻址方式类似,不同的是基址加变址再加上一个位移量形成操作数的有效地址。缺省段的使用仍然是DS与BX组合,SS与BP组合。
这种寻址方式通常用于对二维数组的寻址。
例如,存储器中存放着由多个记录组成的文件,则位移量可指向文件之首,基址寄存器指向某个记录,变址寄存器则指向该记录中的一个元素。
这种寻址方式也为堆栈处理提供了方便。
一般(BP)可指向栈顶,从栈顶到数组的首址可用位移量表示,变址寄存器可用来访问数组中的某个元素。
综上所述,有效地址可以由以下三种成分组成:
· 位移量(Displacement)是存放在指令中的一个8位或16位数,但它不是立即数,而是一个地址。
· 基址(Base)是存放在基址寄存器(BX或BP)中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串的首地址。
· 变址(Index)是存放在变址寄存器(SI或DI)中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。
有效地址的计算可用下式表示:
EA = 基址 + 变址 + 位移量
这三种成分都可正可负,以保证指针移动的灵活性。它们任意组合使用,可得到不同的寻址方式。
(或 MOV AX, MASK[BX+SI],或 MOV AX, [MASK+BX+SI])
如(DS)= 3000H,(BX)= 2000H,(SI)= 1000H,MASK = 0250H,
则物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H
指令执行情况如图3.6所示,最后的执行结果是(AX)= 1234H。
前面的与数据有关的寻址方式最终确定的是一个数据的地址,而这里的与转移地址有关的寻址方式最终确定一条指令的地址。顺序执行的指令地址是由指令指针寄存器IP自动增量形成的,而程序转移的地址必须由转移类指令和CALL指令指出,这类指令表示转向地址的寻址方式包括:段内直接寻址、段内间接寻址、段间直接寻址、段间间接寻址。
SHORT表示位移量在-128~127字节之间。
NEA*表示在同一段内转移,位移量在-32768~32767字节范围内。
**R表示转移距离超过±32K字节,或是在不同段之间转移。
因为CS:IP寄存器总是指向下一条将要执行的指令的首地址(称为IP当前值),当转移指令执行后,必须修改IP或CS、IP的值。当转移指令给出位移量时,用IP当前值加上位移量即为新的IP的值。
SHORT转移,称为短转移,位移量用一个字节(8位)来表示。
NEAR转移,称为近转移,位移量用16位表示,因为程序控制仍然在当前代码段,所以只修改IP的值,CS的值不变。
FAR转移,称为远转移,因为程序控制超出了当前代码段,所以CS和IP都必须修改为新的值。
与转移地址有关的4种寻址方式就是告诉CPU如何修改CS和IP的值,以达到控制程序转移的目的。
1 段内直接寻址(Intrasegment direct addressing)
这种寻址方式在指令中直接指出转向地址,如:
JMP SHORT NEXT
JMP NEAR PTR AGAIN
其中,NEXT和AGAIN均为转向的符号地址。在机器指令中,操作码之后给出的是相对于当前IP值的位移量(转移距离),所以,转向的有效地址是当前IP值与指令中给出的位移量(8位或16位)之和。
注意:这种寻址方式适用于条件转移及无条件转移指令,当用于条件转移指令时,位移量只允许8位。
1060:000D EB04 JMP SHORT NEXT
IP当前值→ 1060:000F … …
1060:0011 … …
1060:0013 0207 NEXT: ADD AL,[BX]
CPU在执行JMP指令时,IP指向了下一条指令,其值为000F,JMP SHORT NEXT指令的机器语言为EB04,EB为操作码,04为位移量,所以转向的有效地址应为:
000F + 0004 = 0013
0013正是标号NEXT的地址。JMP指令执行后,将IP寄存器修改为0013,代码段寄存器CS不变。紧接着CPU根据CS:IP的指示,取出1060:0013中的ADD指令开始执行,这样实现了程序的转移。
2 段内间接寻址(Intrasegment indirect addressing)
这种寻址方式在指令中用数据寻址方式(除立即寻址方式外)间接地指出转向地址,如:
JMP BX
JMP NEAR PTR [BX]
JMP TABLE[SI]
根据指令中的寻址方式,确定一个寄存器或一个存储单元,其内容就是指定转向的有效地址。因为程序的转移仍在同一段内进行,所以只需将IP修改成新的转向地址,CS不变。段内转移指令中的NEAR PTR是可以缺省的。
注意:这种寻址方式以及以下的两种段间寻址方式都不能用于条件转移指令。
条件转移指令只能使用段内直接寻址的8位位移量,而JMP和CALL指令则可用四种寻址方式中的任何一种。
假设: (DS)= 2000H,(BX)= 1256H,(SI)= 528FH,
位移量 = 20A1H,(232F7H)= 3280H,(264E5H)= 2450H。
例 JMP BX
则执行该指令后(IP)= 1256H
例 JMP [BX][SI]
则指令执行后(IP)=(16d ×(DS)+(BX)+(SI))
=(20000H + 1256H + 528FH)
=(264E5H)
= 2450H
3 段间直接寻址(Intersegment direct addressing)
段间直接寻址和段内直接寻址类似,指令中直接给出转向地址,不同的是,在符号地址之前要加上表示段间远转移的 操作符FAR PTR。
指令格式如下:
JMP FAR PTR OUTSEG
因为是段间转移,CS和IP都要更新,这个新的段地址和偏移地址由指令操作码之后的连续两个字提供,所以只要将指令中提供的转向偏移地址装入IP,转向段地址装入CS,就完成了从一个段到另一个段转移的工作。
4 段间间接寻址(Intersegment indirect addressing)
这种寻址方式仍然是用相继两个字的内容装入IP和CS来达到段间的转移目的的,但这两个字的存储器地址是通过指令中的数据寻址方式(除立即寻址方式和寄存器寻址方式外)来取得的。
为了说明寻址两个字单元,指令中必须加上双字操作符DWORD。指令格式如下:
JMP DWORD PTR [SI]
JMP DWORD PTR[TABLE+BX]
8086寻址方 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)