格式
segreg(段基址):base_address(offset_address,index,size)
该格式对应的表达式为:
segreg(段基址):base_address+ offset_address+ index*size
总结:任意一种内存寻址方式,其格式都是这个通用格式的子集,都是格式中各种成员的组合
成员项介绍
base_address 是基地址,可以为整数、变量名,可正可负。
offset_address 是偏移地址,index 是索引值,这两个必须是那 8 个通用寄存器之一。
size 是个长度,只能是 1、2、4、8(Intel 语法中也是只能乘以这 4 个数)。
寻址方式
直接寻址:此寻址中只有 base_address 项
movl $255,0xc00008F0
movl $6,var
寄存器间接寻址:此寻址中只有 offset_address 项,即格式为(offset_address),不要忘记格式中的圆括号,如 mov (%eax), %ebx
**寄存器相对寻址:**此寻址中有 offset_address 项和 base_address 项,即格式为 base_address(offset_address)。
movb -4(%ebx),%al
变址寻址:此类寻址称为变址的原因是含有通用格式中的变量 Index。因为 index 是 size 的倍数,所以有 index 的地方就有 size。既然是变址,只要有 index 和 size 就成了,base_address 和 offset_address 可有可无,注意,格式中没有的部分也要保留逗号来占位。一共有 4 种变址寻址组合,下面各举个例子。
无 base_address,无 offset_address:
movl %eax,(,%esi,2)
功能是将 eax 的值写入 esi*2 所指向的内存。
无 base_address,有 offset_address:
movl %eax,(%ebx,%esi,2)
功能是将 eax 的值写入 ebx+esi*2 所指向的内存。
有 base_address,无 offset_address:
movl %eax,base_value(,%esi,2)
功能是将 eax 的值写入 base_value+esi*2 所指向的内存。
有 base_address,有 offset_address:
movl %eax,base_value(%ebx,%esi,2)
功能是将 eax 的值写入 base_value+ebx+esi*2 所指向的内存。