同intel汇编寻址方式都是一样的,只是语法上有点区别。通用的寻址格式如下:
1. 直接寻址
这种寻址方式相当于只使用了ADDRESS_OR_OFFSET字段,寻址格式如下:
2. 变址寻址
这里只用到了ADDRESS_OR_OFFSET和%INDEX两个字段,INDEX可以是所有的通用寄存器,也同样可以包含MULTIPLIER字段,例如1, 2, 4,还是来看实际的例子吧(maximum.s):
寄存器eax中,所以这种寻址方式适用于遍历数组。
3. 间接寻址
地址在寄存器中,例如:
4. 基址寻址
类似于间接寻址,例如:
ADDRESS_OR_OFFSET(%BASE_OR_OFFSET, %INDEX, MULTIPLIER)最终的寻址地址为:
FINAL ADDRESS = ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER * %INDEX其中ADDRESS_OR_OFFSET、MULTIPLIER都是常量,另外两个必须是寄存器,还有其中一些字段是可以省略的,省略掉的字段相当于用0代替。
1. 直接寻址
这种寻址方式相当于只使用了ADDRESS_OR_OFFSET字段,寻址格式如下:
movl ADDRESS, %eax例如:
movl 0x0100, %eaxintel语法是:
mov eax, [0100]
2. 变址寻址
这里只用到了ADDRESS_OR_OFFSET和%INDEX两个字段,INDEX可以是所有的通用寄存器,也同样可以包含MULTIPLIER字段,例如1, 2, 4,还是来看实际的例子吧(maximum.s):
movl $0, %edi movl data_items(,%edi,4), %eaxdata_items在高级语言中可以叫做数组吧,这里相当于把数组中的第一个元素拷贝到eax寄存器中。因为data_items定义为long类型,如果edi值为1呢,那么movl data_items(,%edi,4), %eax这句话相当于把数组中的第二个元素拷贝到
寄存器eax中,所以这种寻址方式适用于遍历数组。
3. 间接寻址
地址在寄存器中,例如:
movl (%eax), %ebx同intel语法为:
mov eax, [esi]
4. 基址寻址
类似于间接寻址,例如:
movl 4(%eax), %ebxintel语法为:
mov eax, [ebp-8]