鱼C论坛

 找回密码
 立即注册
查看: 2117|回复: 5

[技术交流] 80x86寻址方式

[复制链接]
发表于 2014-12-25 08:48:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Nmboy 于 2014-12-25 09:07 编辑

讲之前我们先说一下什么是有效地址:通常我们把操作数的偏移地址称为有效地址。
偏移地址是从基址开始计算、偏移量是距离从当前指令开始计算,汇编语言一般用的是偏移量(跳转指令)
1,指令
操作码 操作数
①指令由操作吗和操作数两部分组成
②操作码说明计算机要执行那些操作,例如:传送,移位,跳转..等操作,4
它是指令中不可缺少的组成部分
③操作数是指令执行的参与者,即各种操作的对象
④有些指令不需要操作数,通常的指令都有一个或两个操作数,也有特殊的指令有
3个或4个操作数

①每种指令的操作码
用一个唯一的助记符表示(指令功能的应为缩写)。
对应着机器指令的一个二进制编码。
②指令中的操作数
可以是一个具体的数、可以是存放数据的寄存器、或指明数据在主存位置的存储器地址。
   MOV          AX,                        12
          操作码       目的操作数         源操作数
上面的汇编代码就是把12(源操作数)传送至AX(目的操作数中)                                             
注意:①当源操作数移动到目的操作数中,源操作数中的值没有被清空,还是它原来的值                          
          ②汇编都是以16进制存储的
下面是一些指令操作数的表达
r8:任意一个8位通用寄存器
 如: AH  AL  HB   BL    CH  CL   DH  DL
 r16:任意一个16位通用寄存器
 如: AX  BX  CX   DX    SI  SI   BP  SP
 reg:代表 r8 和 r16 位通用寄存器
 seg:段寄存器 如:CS   DS   ES   SS
 m8 :一个8位存储器操作数单元(所有主存寻址方式)
 m16:一个16位存储器操作数单元(所有主存寻址方式)
 mem:代表 m8 和 m16
 i8 :一个8位立即数
 i16:一个16位立即数
 imm:代表 i8 和 i16 位立即数
 dest:目的操作数
 src :源操作数
每个寻址方式都可以写成不同的形式   例如以下:
MOV AX,[BX][SI]     等于 MOV AX,[BX+SI]

MOV AX,12[SI]       等于 MOV AX,[SI+12]

MOV AX 12[BX][SI]   等于 MOV AX,12[BX+SI] 或 MOV AX,[BX+SI+12]
2,寻址方式                                                                                                                                         
寻址方式分为立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、寄存器相对寻址、基址变址寻址,相对基址变址寻址 下面我们来一一讲解
在说立即数寻址方式的前提,我们先了解一下什么是立即数?
立即数就是操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数,一般情况下之处理8(i8)位和16(i16)位立即数 ,
①立即数寻址方式:用来表示常数,它经常用来给寄存器赋初值
例如:

MOV AL,5   指令执行后 AL = 5
②寄存器寻址方式:指令所要的操作数已经存储在某个寄存器中,或者是把目标操作数存入寄存器,把在指令中指出所使用寄存器的寻址方式
如:MOV BX,AX 
  指令中可以引用的寄存器及其符号名称如下:
  8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
  16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
  32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
寄存器寻址方式是一种简单快捷的寻址方式,源操作数和目的操作数都可以是寄存器
1,源操作是寄存器寻址方式
ADD  VARD,EAX          ADD VARW,AX                  MOV VARB,BH

其中VARD,VARW和VARB是双子,字和字节类型的内存变量
2,目的操作数是寄存器寻址方式
ADD BH,78H          ADD AX,1234H          MOV EBX,123456H等

注:ADD是加法
3,源操作数和目的操作数都是寄存器寻址方式
  MOV EAX,EBX       
  MOV AX,BX      
  MOV DH,BL等
③直接寻址方式:指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。
例:假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?

由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;

访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;

取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。

所以,在执行该指令后,BX的值就为5213H。

由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。

下面指令的目标操作数就是带有段前缀的直接寻址方式。

MOV ES:[1000H], AX

直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。

注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。
④寄存器间接寻址:操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,
在不使用段超越前缀的情况下,有下列规定:

若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。

例3.2 假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?

解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即: 

PA=(DS)*16+DI=1000H*16+2345H=12345H。

所以,该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。
⑤寄存器相对寻址:操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)的内容和指令中的8位/16位偏移量之和,
早起不使用段超越前缀的情况下,有下列规定:
、若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
、若有效地址用BP来指定,则其缺省的段寄存器为SS
例3.3 假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?

解:根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
 
图3.5 寄存器相对寻址方式的执行过程示意图
 
EA=(SI)+100H=2345H+100H=2445H
 
该操作数的物理地址应由DS和EA的值形成,即:
 
PA=(DS)*16+EA=1000H*16+2445H=12445H。

所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。
⑥基址变址寻址方式:操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和,所以有效地址由两成乘法组成。
如下:
MOV   AX.[BX][DI]   或者写为:MOV     AX,[BX+DI]
⑦相对基址变址寻址方式:操作数在存储器中,其有效地址是一个寄存器(BS、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和,
有效地址 = BS/BP + SI/DI + 8/16位位移量
如: MOV AX,[BX+SI+06H]  ; AX<-DS:[BX+SI+06H] 

例3.5 假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?

解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H

该操作数的物理地址应由DS和EA的值形成,即:

PA=(DS)*16+EA=1000H*16+2310H=12310H

所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-12-25 09:07:37 | 显示全部楼层
:lol:抢个坐
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-25 20:21:56 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-12-28 20:14:14 | 显示全部楼层
觉的没有必要这么认真,浪费时间,尽快完成过渡吧。。。个人建议,不喜勿喷。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-14 09:22:50 From FishC Mobile | 显示全部楼层
真不错的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-1-24 00:08:44 | 显示全部楼层
好东西{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表