Linux下汇编学习-3寻址方式

同intel汇编寻址方式都是一样的,只是语法上有点区别。通用的寻址格式如下:
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, %eax
intel语法是:
mov eax, [0100]

2. 变址寻址
这里只用到了ADDRESS_OR_OFFSET和%INDEX两个字段,INDEX可以是所有的通用寄存器,也同样可以包含MULTIPLIER字段,例如1, 2, 4,还是来看实际的例子吧(maximum.s):
movl $0, %edi
movl data_items(,%edi,4), %eax
data_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), %ebx
intel语法为:
mov eax, [ebp-8]

你可能感兴趣的:(linux,汇编,String)