经常会把AT&T汇编语法中的变址寻址(indexed memory mode)与寄存器间接寻址搞混。
1. 变址寻址模式
变址寻址特别适合于访问内存中的一系列连续数据,即数组。表达式格式为
base_address(offset_address,index,size)
其中base_address是内存地址(例如数组首地址),而offset_address 和 index的值必须是寄存器保存的值,size可以为数字值。
最终的地址为base_address + offset_address + index * size。下面用一个实例代码演示一下。
<pre name="code" class="objc">#test1.s
.section .data
output:
.asciz "The value is %d\n"
values:
.int 10,15,12,18,5
.section .text
.global _start
_start:
movl $0,%edi
loop:
movl values(,%edi,4),%eax
pushl %eax
pushl $output
call printf
addl $8,%esp
inc %edi
cmpl $5,%edi
jne loop
movl $0,%ebx
movl $1,%eax
int $0x80
然后编译
gcc test1.s -nostdlib -lc