汇编语言指令由操作码和操作数两部分组成。
操作码说明指令的功能,即计算机要执行的具体操作
如:传送、移位、运算等,是指令中不可缺少的组成部分
操作数是指令执行的参与者,即各种操作的对象。
有些指令不需要操作数,有些指令有一个或两个操作数。
有一个操作数的叫单操作数,有两个操作数的叫双操作数。
~~~
操作码 目的操作数,源操作数
MOV EAX,00401000
~~~
要指令执行,就要找到指令中的操作数,
要找到操作数,就要找到存放操作数的地址,
寻找指令中的操作数地址的方式叫做寻址方式;
**全七类寻址方式:**
**1.立即寻址**
操作数以字节形式紧跟在操作码后边
常用于给CPU中的寄存器或存储单元赋值
立即数只能用作源操作数,不能作为目的操作数。
例子:
~~~
MOV AL,56H 将立即数56H,送入8位寄存器AL
MOV AX,1234H 将16位立即数1234H,送16位寄存器AX
~~~
**2.寄存器寻址**
操作数存放在CPU的寄存器中,寄存器可以是16位也可以是8位
不用执行寻找操作数的总线周期,执行速度最快。
`MOV AX,BX`
**3.存储器寻址**
操作数放在存储器中,除代码段之外的所有段数据。
这种存储方式中,指令给出的是存放该操作数的存储单元的地址
或产生该存储单元地址的表达试。
CPU执行指令时,首先根据操作数字段提供的地址信息,由
执行单元EU计算出有效地址EA,再由总线接口单元BIU
根据物理地址公式"PA=段首地址X10H+有效地址"计算出物理地址
然后到物理地址对应的内存单元取出操作数,执行对该数的操作
存储器寻址根据计算偏移地址的方法不同分为以下5种
**(1)直接寻址**
这种寻址方式是从存储器中寻找操作数最简单的一种,
指令中直接给出的是该操作数在存储器中的有效地址;其物理地址为:
PA=段首地址X10H+EA(段首地址默认使用DS段寄存器,EA为指令中给出的有效地址)
例子:
`MOV AX,[2000H]`
若操作数不在数据段,则应在指令中使用段跨越前缀,指明使用的数据在哪一个段
例如:
`MOV AX,ES:[2000H]`
该指令将物理地址为PA=(ES)X10H+2000H单元的值送AX
**(2)寄存器间接寻址**
操作数的有效地址由指令中指定的寄存器BX,BP,SI或DI的内容指定。
可分为下面两种情况
①SI,DI或BX寄存器间接寻址,通常操作数实在数据段DS中,因此,
他们的物理地址是PA=(DS)X10H+EA
例:
`MOV AX,[BX]`
设(DS)=2000H,(BX)=1000H,则该操作数的物理地址为:
`PA=2000HX10H+1000H=21000H`
这条指令的执行结果是把内存单元21000H中的数据送到AX寄存器中
②若是寄存器间接寻址,则该操作数在堆栈段SS中,即以堆栈段寄存器SS
与BP组合形成操作数的物理地址:PA=(SS)X10H+(BP)
例:
`MOV BX,[BP]`
设(SS)=1000H,(BP)=1500H,则`PA=1000Hx10H+1500H=11500H`
该操作数把11500H存储单元的内容送到BX寄存器
**(3)寄存器相对寻址**
这种寻址方式的操作数存放在存储器中的内存单元中,
是以基址寄存器(BX或BP)或变址寄存器(DI或SI)的内容为基地址
然后在这个地址上加上8位或16位的位移量Disp,形成真正操作数的有效地址EA
当寄存器为BX、SI、DI时,用段寄存器DS的内容作为段基地址,则物理地址:
`PA=(DS)X10H+(BX)/(SI)/(DI)+Disp8/Disp16`
若寄存器为BP,则段寄存器SS的内容作为段首地址,则物理地址为:
`PA=(SS)X10H+(BP)+Disp8/Disp16`
例:
`MOV DI,[BX+2]`
**(4)基址变址寻址**
操作数存放在内存单元中,其偏移地址是基址寄存器的内容加上变址寄存器的内容之和。
> 若基址寄存器为BX,则段寄存器为DS;
> 若基址寄存器为BP,则段寄存器为SS;
则操作数物理地址为:
~~~
PA=(DS)X10H+(BX)+(SI)/(DI)
或
PA=(SS)X10H+(BP)+(SI)/(DI)
MOV DX,[BP][SI]
~~~
**(5)相对基址变址寻址**
操作数存放在内存单元中,其中有效地址由指令指定的基址寄存器加变址寄存器的内容在加上指令中的8位或16位偏移量Disp得到,
其中物理地址为:
~~~
PA=(DS)X10H+(BX)+(SI)/(DI)+Disp
或
PA=(SS)X10H+(BP)+(SI)/(DI)+Disp
~~~
例:
~~~
MOV AX,MAS[BX][SI] ;MAS为符号地址
MOV DX,5[BX][DI] ;将偏移地址为5+(BX)+(DI)所指的单元的值送DX
~~~