Nmboy 发表于 2014-12-25 08:48:42

80x86寻址方式

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

讲之前我们先说一下什么是有效地址:通常我们把操作数的偏移地址称为有效地址。偏移地址是从基址开始计算、偏移量是距离从当前指令开始计算,汇编语言一般用的是偏移量(跳转指令)1,指令
操作码 操作数
①指令由操作吗和操作数两部分组成
②操作码说明计算机要执行那些操作,例如:传送,移位,跳转..等操作,4
它是指令中不可缺少的组成部分
③操作数是指令执行的参与者,即各种操作的对象
④有些指令不需要操作数,通常的指令都有一个或两个操作数,也有特殊的指令有
3个或4个操作数
①每种指令的操作码
用一个唯一的助记符表示(指令功能的应为缩写)。
对应着机器指令的一个二进制编码。②指令中的操作数
可以是一个具体的数、可以是存放数据的寄存器、或指明数据在主存位置的存储器地址。   MOV          AX,                        12
          操作码       目的操作数         源操作数上面的汇编代码就是把12(源操作数)传送至AX(目的操作数中)                                             注意:①当源操作数移动到目的操作数中,源操作数中的值没有被清空,还是它原来的值                                  ②汇编都是以16进制存储的下面是一些指令操作数的表达r8:任意一个8位通用寄存器
如: AHALHB   BL    CHCL   DHDL
r16:任意一个16位通用寄存器
如: AXBXCX   DX    SISI   BPSP
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,   等于 MOV AX,

MOV AX,12       等于 MOV AX,

MOV AX 12   等于 MOV AX,12 或 MOV AX,
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,源操作是寄存器寻址方式ADDVARD,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, ,在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?

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

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

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

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

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

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

MOV ES:, AX

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

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

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

例3.2 假设有指令:MOV BX,,在执行时,(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, ,在执行它时,(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.   或者写为:MOV   AX,
⑦相对基址变址寻址方式:操作数在存储器中,其有效地址是一个寄存器(BS、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和,有效地址 = BS/BP + SI/DI + 8/16位位移量如: MOV AX,; AX<-DS:

例3.5 假设指令:MOV AX, ,在执行时,(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





Nmboy 发表于 2014-12-25 09:07:37

:lol:抢个坐

hfut_wangfei 发表于 2014-12-25 20:21:56

强烈支持楼主ing……

dAb 发表于 2014-12-28 20:14:14

觉的没有必要这么认真,浪费时间,尽快完成过渡吧。。。个人建议,不喜勿喷。。。

qxfsy 发表于 2015-1-14 09:22:50

真不错的

来自他方 发表于 2015-1-24 00:08:44

好东西{:1_1:}
页: [1]
查看完整版本: 80x86寻址方式