先来看寄存器相对寻址方式:
操作数的有效地址是一个寄存器的内容和指令中给定的一个位移量(disp)之和。对于16位寻址,这个寄存器只能是基址寄存器BX、BP或变址寄存器SI、DI;对于32位寻址,允许使用任何32位通用寄存器。位移量可以是8位、16位、32位(只适用于32位寻址情况)的带符号数。这种寻址方式常用在访问数组中的数据。
有效地址EA=(基址<或变址>寄存器)+disp
若指令中使用的是BX、SI、DI、EAX、EBX、ECX、EDX、ESI、EDI,则默认操作数在数据段,即它们默认与DS段寄存器配合;若使用的是BP、EBP、ESP,则默认操作数在堆栈段,即它们默认与SS段寄存器配合。这两种情况都允许使用段超越前缀。
关于BP寄存器:
MOV AX,[BP]就是把BP作为偏移地址,SS作为段所寻到的内存设为AX。如果不用[BP]而用[SP],就是把SP作为偏移。使用BP的理由是SP会随着PUSH,POP而改变,而BP却不变,可用于访问函数参数(请了解过程间传递参数的3种方式)。
注:上图来自张雪兰《Intel 80X86/Pentium汇编语言程序设计》(第3版)