- 论坛徽章:
- 0
|
C代码:
//foo.c
void foo(int m, int n)
{
printf("m=%d, n=%d\n", m, n);
}
int main()
{
int b = 3;
foo(b+=3, ++b);
printf("b=%d\n", b);
return 0;
}
上面c代码对应的汇编代码:
arm-linux-objdump foo.o
temp.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <foo>:
0: e1a0c00d mov ip, sp
4: e92dd800 stmdb sp!, {fp, ip, lr, pc}
8: e24cb004 sub fp, ip, #4 ; 0x4//上面这三句话建立栈回朔结构体
c: e24dd008 sub sp, sp, #8 ; 0x8
10: e50b0010 str r0, [fp, #-16]
14: e50b1014 str r1, [fp, #-20] //压栈,保存int m和int n; m=r0,n=r1;
18: e59f0010 ldr r0, [pc, #16] ; 30 <.text+0x30>//z这句话是什么意思?转到调用printf?
1c: e51b1010 ldr r1, [fp, #-16]
20: e51b2014 ldr r2, [fp, #-20]
24: ebfffffe bl 24 <foo+0x24>
28: e24bd00c sub sp, fp, #12 ; 0xc//这里应该是恢复栈寄存器的内容了
2c: e89da800 ldmia sp, {fp, sp, pc}
30: 00000000 andeq r0, r0, r0
00000034 <main>:
34: e1a0c00d mov ip, sp
38: e92dd800 stmdb sp!, {fp, ip, lr, pc}
3c: e24cb004 sub fp, ip, #4 ; 0x4
40: e24dd004 sub sp, sp, #4 ; 0x4
44: e3a03003 mov r3, #3 ; 0x3
48: e50b3010 str r3, [fp, #-16]
4c: e51b3010 ldr r3, [fp, #-16] //[fp,#-16] 是b的内存空间;b=3; r3=3;
50: e2833003 add r3, r3, #3 ; 0x3 //b+=3;r3=6;
54: e1a02003 mov r2, r3 //r2=6;
58: e50b2010 str r2, [fp, #-16]
5c: e51b3010 ldr r3, [fp, #-16]
60: e2833001 add r3, r3, #1 ; 0x1
64: e50b3010 str r3, [fp, #-16] //r3=7;
68: e1a00002 mov r0, r2
6c: e1a01003 mov r1, r3//r0=6;r1=7;r2=6;r3=7; 传递参数用r0和r1,r2,r3只是中间变量,不用计较,所以arm-linux-gcc 在传递函数参数时是从左至右的
70: ebfffffe bl 70 <main+0x3c>//这句话怎么就调用子函数了?
74: e59f0010 ldr r0, [pc, #16] ; 8c <.text+0x8c>
78: e51b1010 ldr r1, [fp, #-16]
7c: ebfffffe bl 7c <main+0x48>
80: e3a03000 mov r3, #0 ; 0x0
84: e1a00003 mov r0, r3
88: e89da808 ldmia sp, {r3, fp, sp, pc}
8c: 0000000c andeq r0, r0, ip
Disassembly of section .rodata:
00000000 <.rodata>:
0: 64253d6d strvst r3, [r5], #-3437
4: 3d6e202c stcccl 0, cr2, [lr, #-176]!
8: 000a6425 andeq r6, sl, r5, lsr #8
c: 64253d62 strvst r3, [r5], #-3426
10: 0000000a andeq r0, r0, sl
Disassembly of section .comment:
00000000 <.comment>:
0: 43434700 cmpmi r3, #0 ; 0x0
4: 4728203a undefined
8: 2029554e eorcs r5, r9, lr, asr #10
c: 2e342e33 mrccs 14, 1, r2, cr4, cr3, {1}
10: Address 0x10 is out of bounds.
请教上面用蓝色标注的问题,谢谢大家![](static/image/smiley/default/icon_smile.gif) |
|