一、操作数的寻址方式

立即寻址方式

格式: 操作码 数字表达式(将数据送入寄存器中)
源操作数可以是8位也可以是16位。

MOV AH, F5H (字节操作) F5H称为立即数(8位操作数)
MOV AL, 8AH (字节操作) 8AH称为立即数

直接寻址方式

指令格式: 操作码 寄存器(16位) , 地址表达式(将地址的内容送入寄存器中)

指令格式: 操作码 寄存器(16位) , 地址表达式(将地址的内容送入寄存器中)

MOV AX,ES:[2000H] 将ES:2000H单元内容送入AX。

MOV AX,LABLE 或 MOV AX,[LABEL]将标号为LABLE(存放操作数单元的符号地址) ,即DS:LABLE中的内容送入AX。LABLE要在段定义中指明。
此时,字操作和字符操作的等效:
MOV AX,(2000H);只需要写低字节地址
MOV AL,(2000H); MOV AH,(2001H)

寄存器寻址方式

格式:操作码 寄存器,寄存器(将寄存器中的内容送入另一个寄存器)
可操作性的寄存器:

1)8 位寄存器r8: AH、AL、BH、BL、CH、CL、DH、DL

2)16 位寄存器r16:AX、BX、CX、DX、SI、DI、BP、SP
3)4个段寄存器seg: CS、DS、SS、ES

注意点

1、目的和源寄存器的 位数必须相同,不同 位数寄存器之间不能传送数据处理 如: MOV BX,AH
如果要将数据送入段寄存器(CS、DS、ES、SS),必须先将这个数送入一个非段寄存器,然后在送到段寄存器

寄存器间接寻址方式

格式:操作码 寄存器,(寄存器) (BX决定的存储单元的内容送到AX寄存器 )

MOV AX, [BX] ;AX←DS:[BX]

注意点

对于BX、SI、DI,默认的段地址在DS段寄存器
对于BP,默认的段地址在SS段寄存器
物理地址计算方法:

物理地址 = (DS)×16 + (BX)或(SI)或(DI)
物理地址 = (SS)× 16 + (BP)

寄存器相对寻址方式

格式:操作码 寄存器,相对值DISP+基址或变址寄存器

MOV AX, [SI+06H] ;AX←DS:[SI+06H]
MOV AX, 06H[SI] ;AX←DS:[SI+06H]

地址计算

地址计算
DISP可以是16位,也可以是8位,DISP是一个数值的代号!

基址变址寻址方式

格式: 操作码 寄存器,(基址寄存器)+(变址寄存器)

MOV AX, [BX+SI] ;AX←DS:[BX+SI]

MOV AX, [BX][SI] ;AX←DS:[BX+SI]
有效地址由基址寄存器(BX或BP)的内容加上变址寄存器(SI或DI)的内容构成:
有效地址=BX/BP+SI/DI
段地址对应BX基址寄存器默认是DS,对应BP基址寄存器默认是SS;可用段超越前缀改变

相对基址变址寻址方式

格式:操作码 寄存器,DISP+(基址寄存器)+(变址寄存器)
有效地址=BX/BP+SI/DI+8/16位偏移量

MOV AX, [BX+DI+6] ;AX←DS:[BX+DI+6]
MOV AX, 6[BX+DI] ; MOV AX, 6[BX][DI]

段超越

当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。
形式
BP默认SS,BX默认DS,通过段超越可以进行修改。
注意:不是所有的段都可做段超越前缀

例题讲解

指出下列指令错误:
1)MOV AH,BX; //一个8位,一个16位,不匹配
2)MOV [SI],[BI]; //src和dst都是间接寻址,然而操作数只能有一个是这样的形式
3)MOV AX,[SI][DI]; //[BX/BP] [SI/D] 显然不符合
4)MOV AX[BX][BP]; //和3同样问题
5) MOV [BX],ES:AX; //正确的形式应该是 MOV [BX],ES:[AX] ;但是就算这样也是错的,错误原因和2一样
6)MOV CS,AX; //CS不能通过赋值改变,只能通过跳转指令
7)MOV DS,2000H; //正确应该是MOV AX,2000H; MOV DS,AX;

二、转移地址的寻址方式

段内相对寻址

JMP DISP (disp:8位或16位的地址偏移量)

此时,转移地址应该是代码段寄存器CS内容加上指令指针IP内容,再加上相对地址位移量DISP。

运转方式

段内间接寻址

JMP CX; CX的内容为转移地址的段内偏移量
JMP WORD PTR CX

WORD PTR是寻址一个字的标记,指令中必须加上
CX的内容为新的IP值(这个与相对寻址区别开),程序转移到新的入口处 ,CX值不能超出该段的区域

运算过程

段间直接寻址

JMP FAR PTR ADD1;
ADD1为转移地址的标号
FAR表示转移距离大于±32K,或是不同段之间转移。

指令操作码后的第二个字将赋予代码段寄存器CS第一个字将赋予指令指针寄存器IP。最后CS内容和IP内容相加则得转移地址。

运算过程

段间间接寻址

JMP DWORD PTR[BP][DI]
段间间接寻址只适用于存贮器寻址方式

确定转移地址需要32位信息 相当于两个字,所以用DWORD,段间间接寻址只适用于存贮器寻址方式

这种寻址方式可计算出存放转移地址的存贮单元的首地址,与此相邻的4个单元中,前两个单元存放16位的段内偏移地址,而后两单元存放的是16位的段地址
运算过程

转移地址寻址方式的小结

通过对运转流程的观察,可以确定,通过JMP操作只会对代码段产生影响。
使代码跳转到我们所指定的代码地址。