(段超越前缀用来改变默认的段寻址,通常内址寻址是数据段或者堆栈段。
但是可以在指令前加上段超越前缀,来访问其他段的数据。比如 di,si,bx 的段默认位是 ds,bp 默认为 ss。)
1.立即寻址方式:
操作数包含在指令中,跟在操作码后存在在代码段。
立即数寻址方式主要用来给寄存器和存储单元赋值,因此这种寻址方式不能用于单操作数指令;
若用于双操作数指令,也只能用于源操作数字段,不能用于目的操作数字段。
比如 "mov ax, 1111H"。
2.寄存器寻址方式:
不需要通过访问存储器来取得操作数, 所以执行速度快。
比如 "mov si, ax", "mov eax, ebx", "add vard, eax", "add varw, ax"。
3.直接寻址方式:
操作数在存储器中,指令直接包含有操作数的有效地址。
操作数一般放在数据段。所有操作数的地址由 DS 加上指令中直接给出的 16 位偏移得出。
如果采用超越段前缀,则操作数也可含在数据段外的其他段中。
比如在 ds 内容为 6000H,物理地址为 61111H 中存储内容是 7777H 的情况下,
执行 "mov ax, [1111H]" 后,寄存器 ax 中的内容为 7777H。
目标数采用直接寻址,并且使用了段超越前缀的形式:"mov es:[5678H], al"
这种寻址方式常用于处理单个存储器变量的情况。它可实现在 64k 字节的段内寻找操作数。
直接寻址的操作数通常是程序使用的变量。
注意立即寻址和直接寻址书写上的不同:
"mov ax, 1111H" 为立即数寻址, "mov ax, [1111H]" 为直接寻址。
若 value 为内存字变量: "mov ax, value" 和 "mov ax, [value]" 都为直接寻址。
4.寄存器间接寻址:
比如在 ds 内容为 6000H,si 内容为 1111H,物理地址为 61111H 处存储内容为 7777H 的情况下,
执行 "mov ax, [si]" 后,ax 中的内容为 7777H。
源操作数采用寄存器间接寻址,并使用了段超越前缀的形式:"mov dl, cs:[bx]"
目的操作数采用寄存器间接寻址,使用 bp 作为指针寄存器,缺省的段寄存器为 ss 的形式:"mov [bp], cx"。
5.寄存器相对寻址方式:
操作数在存储器中,操作数的有效地址是一个( 基址寄存器 or 变址寄存器 ) + ( 8 位 or 16 位 )位移量之和。
在指令中给定的 8 位或 16 位位偏移量采用补码形式。
在计算有效地址时,若位偏移量为 8 位,则被带符号拓展成 16 位。
当所得的有效地址超越 FFFFH 时,则取其 64k 的模。
比如在 ds 内容为 5000H, di 内容为 1111H,物理地位 52222H 中存储的内容为 AAAAH 的情况下,
执行 "mov ax, [di+1111H]" 后,ax 内容为 AAAAH。
源操作数采用寄存器相对寻址,引用的段寄存器为 ss 的形式: "mov bx, [bp-4]"
目的操作数采用寄存器相对寻址,引用的段期存器为 ss: 的形式 "mov es:[bx+5], al"
6.基址加变址寻址方式:
操作数在存储器中,操作数的有效地址由基址寄存器 + 变址寄存器的内容得到,
当所得到的有效地址超过 FFFFH 时,就去其 64k 的模。
比如在 ds 为 5000H, bx 为 1111H, di 为 11H,物理地址为 51122H 存储的内容 AAAAH 的情况下,
执行 "mov ax, [bx+di]" 后,ax 内容为 AAAAH。
源操作数采用基址加变址寻址,通过段超越前缀来引用段期存器 es 的形式:"mov ax, es:[bx+si]"
目的操作数采用基址加变址寻址,引用的段寄存器是 ds 的形式:"mov ds:[bp+si], al"
7.相对基址加变址寻址方式:
操作数在存储器中,操作数的有效地址由基址寄存器 + 变址寄存器 + ( 8 位 or 16 位 ) 位偏移量得到。
当所得到的有效地址超过 FFFFH 时,就去其 64k 的模。
比如在 ds 内容为 5000H, bx 为 1111H,di 为 11H,物理地址为 51120H 处存储内容为 AAAAH 的情况下,
执行 "mov ax, [bx+di-2]" 后,ax 内容为 AAAAH。
原文地址:http://blog.csdn.net/pandora_madara/article/details/46539363