# 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 <main>: nop
0x565561ae <main+1>: mov 0x56559019,%eax
0x565561b3 <main+6>: mov $0x56559019,%edi
0x565561b8 <main+11>: movl $0x64,0x4(%edi)
0x565561bf <main+18>: mov $0x1,%edi
0x565561c4 <main+23>: mov 0x56559019(,%edi,4),%ebx
0x565561cb <main+30>: mov $0x1,%eax
0x565561d0 <loop>: mov 0x56559019(,%edi,4),%eax
0x565561d7 <loop+7>: push %eax
0x565561d8 <loop+8>: push $0x56559008
0x565561dd <loop+13>: call 0xf7e17d30 <printf>
0x565561e2 <loop+18>: add $0x8,%esp
0x565561e5 <loop+21>: inc %edi
0x565561e6 <loop+22>: cmp $0xb,%edi
0x565561e9 <loop+25>: jne 0x565561d0 <loop>
0x565561eb <loop+27>: mov $0x0,%ebx
0x565561f0 <loop+32>: mov $0x1,%eax
0x565561f5 <loop+37>: int $0x80
=> 0x565561b3 <main+6>: bf 19 90 55 56 mov $0x56559019,%edi
(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 <main+11>: c7 47 04 64 00 00 00 movl $0x64,0x4(%edi)
(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 <main+18>: bf 01 00 00 00 mov $0x1,%edi
1: /x $eax = 0xa
2: /x $edi = 0x1
3: /x $ebx = 0x0
=> 0x565561c4 <main+23>: 8b 1c bd 19 90 55 56 mov 0x56559019(,%edi,4),%ebx
1: /x $eax = 0xa
2: /x $edi = 0x1
3: /x $ebx = 0x64
=> 0x565561d0 <loop+0>: 8b 04 bd 19 90 55 56 mov 0x56559019(,%edi,4),%eax
1: /x $eax = 0x64
2: /x $edi = 0x1
3: /x $ebx = 0x64
=> 0x565561dd <loop+13>: e8 4e 1b 8c a1 call 0xf7e17d30 <printf>
The value is 100
1: /x $eax = 0x11 #### note --> printf return value ####
2: /x $edi = 0x1
3: /x $ebx = 0x64
*/