注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

寻址方式(二)  

2012-05-06 18:05:16|  分类: 8086饭客网汇编学 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

需要掌握的内容:

1. PC机操作数的寻址方式

2. PC机转向地址的寻址方式

6) 基址变址寻址方式(Based Indexed Addressing

操作数段内偏移地址是一个基址寄存器和一个变址寄存器的内容之和。如基址寄存器为BX,段寄存器则隐含使用DS,如基址寄存器为BP,段寄存器则隐含使用SS,若操作数前指定段寄存器,则应以指定的段寄存器为准。

物理地址=16*DS+BX+

或者 物理地址=16*SS+BP+

这种寻址方式同样适用于数组和表格处理,首地址可存放在基址寄存器中,而用变址寄存器指向数组中的各个元素。

例如: Table db ABCDEFGHIJKLMNOPQRSTUVWXYZ

mov bx,offset Table

mov si,0

mov ah,[bx+si]

inc si ;inc 操作符是加1操作

这种方式由于两个寄存器都可以修改,因而使用起来更加灵活。

例如:

inc byte ptr [bx][si] ; [bx][si]==[bx+si]

把内存地址为16*DS+BX+SI的一个字节内容加1

pop [bp][di]

将堆栈的栈顶元素(一个字)弹出,送入堆栈段(SS指定的段)内的一个字单元中,该单元地址为16*SS+BP+DI

下面的指令将两个基址寄存器或变址寄存器一起使用,因此是错误的。

mov ax,[bx][bp]

inc byte ptr [si][di]

7) 相对基址变址寻址方式(Relative Based Indexed Addressing

操作数段内偏移地址是三个地址分量之和,即一个基址寄存器(BXBP)和一个变址寄存器(SIDI)的内容与一个偏移量(8位或16位)之和。

如基址寄存器为BX,段寄存器则隐含使用DS,如基址寄存器为BP,段寄存器则隐含使用SS

物理地址=16*DS+BX++

或者 物理地址=16*SS+BP++

这种寻址方式为访问数组(特别是二维数组)提供了方便。数组的首地址可用偏移量表示,基址(BXBP)、变址(SIDI)分别用以表示行地址和列地址。

例如:

Table db 1,2,3,4,5

db 6,7,8,9,10

mov bx,0

mov si,0

mov ah,Table[bx][si]

add bx,5

mov ah,Table[bx][si]

inc si

mov ah,Table[bx][si]

例如:

mov word ptr 0228H[bx][di],ds

ds的内容存入到地址为16*DS+BX+DI+0228H的字空间去。

push [ABC+BX+DI]

把数据段内的一个字压入堆栈,该字的地址为16*DS+ABC+BX+DI

mov ax,ABC[bp][si]

操作数位于堆栈段,将堆栈段地址为16*SS+ABC+BP+SI的一个字内容存入到AX中。

2. PC机转向地址的寻址方式

段内直接寻址方式(Intrasegment Direct Addressing

段内间接寻址方式(Intrasegment Indirect Addressing

段间直接寻址(Intersegment Direct Addressing

段间间接寻址(Intersegment Indirect Addressing

由于内存被分为段,因此,究竟转向哪里是由代码寄存器CS和指令指针IP共同决定的,由此可将转向地址的寻址分为段内寻址(同一代码段内寻址,CS不变,IP变化)和段间寻址(转向另一代码段内寻址,CS改变,IP也变化)。其次,根据转向地址是由转向指令直接提供的,还是由立即数外的其它数据寻址方式获取的,可将转向地址的寻址分为直接寻址和间接寻址。由指令直接提供的称为直接寻址,由数据寻址方式获取的称为间接寻址。

1) 段内直接寻址方式(Intrasegment Direct Addressing

格式:

(程序控制指令) NEAR PTR DST DST为同一代码段的符号地址)

其中,程序控制指令可以为条件转移指令(jzjnzja)、无条件转移指令(jmp)、循环指令(loop)和子程序调用指令(call)NEAR PTR 为近指针(Near Pointer)操作符,指明后面的符号地址位于同一段内。

汇编时用转向地址(同一段内的符号地址所代表的地址)减去该程序控制指令的下一条指令所在的地址,得到两者间的相对距离,该距离称为相对偏移量。由于转向地址可在程序控制指令之前,也可以程序控制指令之后,因而偏移量可为正也可为负,用补码表示。在汇编过程中,根据转移的距离,决定偏移量的位数。如果转移距离较大,就用16位偏移量,如果较近,就用8位偏移量。

程序运行时,将当前IP寄存器的内容(程序控制指令下一条指令的地址)与指令中的偏移量(8位或16位)相加,将和装入IP实现段内直接转移,

即:

IP=IP+偏移量

这种寻址方式适用于所有程序控制类指令,但是当用于条件转移指令及循环指令时,偏移量只允许8位。无条件转移指令Jmp和子程序调用指令Call既可用16位偏移量也可用8位偏移量,当偏移量为8位时,称为短跳转(Short)。

2) 段内间接寻址方式(Intrasegment Indirect Addressing

这种寻址方式以及以下两种段间寻址方式都不能用于条件转移指令和循环指令。也就是说,条件转移指令和循环指令只能使用段内直接寻址,并且仅为8位偏移量。JmpCall两条指令则可用四种寻址方式中的任何一种。

格式:

JMP(或CALL REG REG为通用寄存器)

JMP(或CALL WORD PTR DST DST为内存中的一个字)

段内间接寻址方式的转向偏移地址不能为立即数,可以是一个寄存器的内容或是一个存储单元的内容。若它为存储单元的内容,则可使用任何一种内存寻址方式。

若寻址方式为寄存器寻址方式,则寄存器的内容便是转向的地址。当CPU执行JMPCALL指令时,就将寄存器的内容装入IP

若寻址方式为内存寻址方式,则转向地址便是存储单元的一个字。其中,WORD PTR为操作符,用以指出其后的寻址方式所取得的转向地址是一个字,CPU执行JMPCALL指令时,就将内存单元一个字装入IP

即:

IPREG REGAXBXCXDXBPSPSIDI

IPWORD PTR DST (DST为内存中的一个字)

以上两种寻址方式均为段内转移,所以只改变了IP寄存器的值,而不改变段寄存器CS的值。

3) 段间直接寻址(Intersegment Direct Addressing

格式:

JMP(或CALL FAR PTR DST DST另一代码段的符号地址)

其中,FAR PTR(Far Pointer)为段间转移操作符,用以说明其后的符号地址位于另一段内。

汇编时,将该符号地址所在的段基址和段内偏移地址写入JMPCALL指令中,将段基址放在高字,将段内偏移地址放在低字。

程序运行,当执行JMPCALL指令时,只要将指令中指定的偏移地址(低字)装入IP寄存器,将指令中指定的段基址(高字)装入段寄存器CS,就完成了从一个段到另一个段转移。

即:

IP=转向的段内偏移地址

CS=转向的段基址

4) 段间间接寻址(Intersegment Indirect Addressing

格式:

JMP(或CALL DWORD PTR DST DST为内存中的一个双字)

其中,DWORD PTR为双字指针(Doubler Word Pointer)操作符,指明转向地址需取双字分别作为段基址和段内偏移地址,可采用任何一种内存数据寻址方式,但不能用寄存器寻址方式和立即数寻址方式。

执行JMPCALL指令时,根据指令中指定的某种内存寻址方式找到内存的一个双字(32位)将高字内容装入段寄存器CS,将低字内容装入IP寄存器,实现段间转移。

  评论这张
 
阅读(212)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017