# An example of indirect addressing (间接寻址)
.section .data
output:
.asciz "The编间 value is %d\n"
values:
.int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
.section .text
.globl main
main:
nop
movl values, %eax # eax = 10 ==>mov 0x56559019,%eax
movl $values, %edi # edi = values address ==>mov $0x56559019,%edi
movl $100, 4(%edi) # $0x56559019+4 = 100 ==>values[1] = 100
mov $1, %edi # edi = 1
movl values(,%edi, 4), %ebx # ebx = 100 ==>values+1*4 = values[1]
mov $1, %eax # eax = 1
xor %edi, %edi # edi = 0
loop:
movl values(, %edi, 4), %eax # eax = 10, 100, 20, 25, 30 ...
push %eax # esp-4
push $output # esp-4
call printf
add $8, %esp # esp+8,回退8个字节
inc %edi
cmp $11, %edi
jne loop
movl $0, %ebx
movl $1, %eax
int $0x80
# gcc -o 02-indirect-addressing 02-indirect-addressing.s -m32
/*
* gdb
*/
/*
(gdb) x/20i
=>0x565561ad
0x565561ae
0x565561b3
0x565561b8
0x565561bf
0x565561c4
0x565561cb
0x565561d0
0x565561d7
0x565561d8
0x565561dd
0x565561e2
0x565561e5
0x565561e6
0x565561e9
0x565561eb
0x565561f0
0x565561f5
=>0x565561b3
(gdb) x/20w 0x56559019
1: /x $eax = 0xa
2: /x $edi = 0x56559019
3: /x $ebx = 0x0
0x56559019: 10 15 20 25
0x56559029: 30 35 40 45
0x56559039: 50 55 60 0
0x56559049: 0 0 0 0
0x56559059: 0 0 0 0
=>0x565561b8
(gdb) x/20w 0x56559019
1: /x $eax = 0xa
2: /x $edi = 0x56559019
3: /x $ebx = 0x0
0x56559019: 10 100 20 25
0x56559029: 30 35 40 45
0x56559039: 50 55 60 0
0x56559049: 0 0 0 0
0x56559059: 0 0 0 0
=>0x565561bf
1: /x $eax = 0xa
2: /x $edi = 0x1
3: /x $ebx = 0x0
=>0x565561c4
1: /x $eax = 0xa
2: /x $edi = 0x1
3: /x $ebx = 0x64
=>0x565561d0
1: /x $eax = 0x64
2: /x $edi = 0x1
3: /x $ebx = 0x64
=>0x565561dd
The value is 100
1: /x $eax = 0x11 #### note -->printf return value ####
2: /x $edi = 0x1
3: /x $ebx = 0x64
*/