Assembly 更高级的间接寻址
不要惊讶,间接寻址经常与数组一起使用。最普遍的间接内存引用格式为:
这条代码有效地将5 £ EAX的值储存到EBX中。相比于使用MUL指令,使用LEA既简单又快捷。但是,你必须认识到在方括号里的表达式必须是一个合法的间接地址。因此,例如,这个指令就不可以用来快速乘6。
[ base reg(基址寄存器) + factor(系数) *index reg(变址寄存器) +constant(常量) ]
其中:
基址寄存器 可以是EAX,EBX,ECX,EDX,EBP,ESP,ESI或EDI寄存器。
系数 可以是1,2,4或8。(如果是1,系数是可以省略的。)
变址寄存器 可以是EAX,EBX,ECX,EDX,EBP,ESI或EDI寄存器。(注意ESP并不可以。)
常量 为一个32位的常量。这个常量可以是一个变量(或变量表达式)。
例子:
这有一个使用数组并将它传递给函数的例子。它使用array1c.c程序(下面列出的)作为驱动程序,而不是driver.c程序。
再看一下LEA指令
LEA指令不仅仅可以用来计算地址,也可以用作其它目的。一个相当普遍的目的是快速计算。考虑下面的代码:
lea ebx, [4*eax + eax]
这条代码有效地将5 £ EAX的值储存到EBX中。相比于使用MUL指令,使用LEA既简单又快捷。但是,你必须认识到在方括号里的表达式必须是一个合法的间接地址。因此,例如,这个指令就不可以用来快速乘6。