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

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

寻址方式(一)  

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

  下载LOFTER 我的照片书  |

需要掌握的内容:

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

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

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

寄存器寻址方式(Register Addressing

立即寻址方式(Immediate Addressing

直接寻址方式(Dirct Addressing

寄存器间接寻址方式(Register Indirect Addressing

寄存器相对寻址方式(Register Relative Addressing

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

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

1) 寄存器寻址方式(Register Addressing

寄存器寻址方式的操作数在某个寄存器中,指令中仅指定寄存器号。

指令中可以引用的寄存器及其符号名称如下:

8位寄存器有:AHALBHBLCHCLDHDL

16位寄存器有:AXBXCXDXSIDISPBP

寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。

1、源操作数是寄存器寻址方式

如:mov value, ax

2、目的操作数是寄存器寻址方式

如:mov bx, 1234h 

3、源和目的操作数都是寄存器寻址方式

如:mov ax, bx

mov dx, bl

由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们应尽可能地使用寄存器寻址方式。 

2) 立即寻址方式(Immediate Addressing

在立即寻址方式中,操作数存放在指令中,在取出指令的同时也就获得了操作数,故将这种操作数称为立即数。

立即寻址方式用来表示常数,经常用于给寄存器赋初值。立即数可以是8位或16位数,如果是16位数,则高位字节存放在高地址中,低位字节存放在低地址中。

mov cl,5 ;cl=5

mov ax,AB ;ah=AASCII al=BASCII

01916H

mov

01917H

B

01918H

A


强调:

立即数不能用于单操作数指令。而双操作数指令只能用于源操作数字段,不能用于目的操作数字段。下面指令是错误的:

inc 1999H 单操作数指令不能使用立即数寻址  inc ax

mov 1000H,ax ;立即数不能作为目的操作数

mov al,AB ;立即数ABASCII码为16位,而目的操作数只有8位。

除上述两种寻址方式外,以下寻址方式的操作数都在除代码段以外的内存区中,在汇编语言源程序中,内存地址是采用逻辑地址的形式表示,逻辑地址可写为:

段基址:段内偏移地址

段基址位于某个段寄存器内,段内偏移地址是存储单元与段起始地址之间的距离,也称为有效地址,记为EAEffective Address)。偏移地址可由下面三个地址分量中的某一个或几个组合求得,并由此命名为不同的寻址方式。

偏移量(Displacement)。偏移量既可用数字也可以用变量名或符号地址表示,既可为8位,也可为16位。

基址(Base Address)。基址为基址寄存器BX或基址指针BP的内容。

变址(Index Address)。变址为源变址寄存器SI和目的变址寄存器DI中的内容。

汇编规定双操作数指令中最多只允许一个操作数位于内存。

3) 直接寻址方式(Dirct Addressing

段内偏移地址由偏移量给出,即EA=偏移量。如果操作数在数据段中,则:物理地址=16*DS+EA,若指定段跨越前缀,在计算物理地址时应使用指定的段寄存器。

mov al,byte ptr [118H]

把数据段DS首地址为118H的一个内存字节送入AL中。byte ptr为字节指针(Byte Pointer)操作符,用来说明对内存一个字节进行操作。word ptrWord Pointer)对内存一个字进行操作。若指令中未指明段寄存器,则隐含为DS。当仅使用数字表示段内直接地址时,必须将其存放在[]内,否则会被认为是立即数。

mov al,byte ptr es:[118H]

把附加段ES首地址为118H的一个内存字节送入AL中。

mov ax,ABC ; == mov ax,[ABC]

表示将数据段DS内符号地址为ABC的字单元内容送入AX中。

mov es:[ABC],ax

AX的内容存入到附加段ES段内符号地址为ABC的字单元中。

dec byte ptr [118H] ;118H地址一个字节内容减1

dec word ptr [118H] ;118H地址一个字内容减1

4) 寄存器间接寻址方式(Register Indirect Addressing

操作数段内偏移地址在基址寄存器BXBP或变址寄存器SIDI中,而操作数则在存储器中。

如果指令中指定的寄存器是BXSIDI,则DS为隐含的段寄存器,即操作数的

物理地址=16*DS+

如果指令中指定BP寄存器,则SS为隐含段寄存器,物理地址=16*SS+BP

若操作数前指定段寄存器说明,则以指定的段寄存器为准。

mov ax,[bx]

mov [bx],bx

mov [bp],cx

dec byte ptr [si]

mov [di],byte ptr ABC

错误:源操作数为直接寻址,目的操作数为寄存器间接寻址,两个操作数都在内存当中,因而错误。

在寄存器间接寻址方式中,除BXBPSIDI,不再允许使用其它寄存器。

mov [ax],cx ;错误

5) 寄存器相对寻址方式(Register Relative Addressing

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

EA=+

如果指令中指定的寄存器是BXSIDI,则DS为隐含的段寄存器,如果指令中指定BP寄存器,则SS为隐含段寄存器,若操作数前指定段寄存器说明,则以指定的段寄存器为准。

物理地址=16*DS++

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

用这种寻址方式处理数组和表格比较方便,可将偏移量设置为数组或表格的首地址,利用修改基址或变址寄存器的内容访问数组或表格中的不同元素。

例如: Table db ABCDEFGHIJKLMNOPQRSTUVWXYZ

lea bx,Table

mov ah,[bx]

mov al,[bx+1]

mov dh,[bx+2]

或者

mov bx,1

mov ah,[Table+bx] ;[Table+bx]==Table[bx]

例如:

mov byte ptr 26H[si],ah ;26H[si]==[si+26H]

ah的内容存入到地址为si+26H的地址字节中,不要忘了是DS段。

push es:86H[di]

把附加段内地址为86H+DI的一个字压入堆栈(堆栈是字操作),物理地址=ES*16+86H+DI

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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