一个很简单的C程序,发现两种情况下用ARM汇编后在栈中存放方式不同,第一种有printtf,数值1 ,2, 3 在栈中按高->低排列,第二种没有printf,数值1,2,3却顺序相反,究竟为何?
1.c 程序
#include <stdio.h>
int main()
{
int i = 1, j = 2, k = 3;
int m;
m = i * j;
printf("%d, %d, %d", &i, &j, &k);
return 0;
}
用ARM汇编后主要部分如下,可看到 1 存高位 ,向下为数值 2 ,3
main:
@ args = 0, pretend = 0, frame = 16
@ frame_needed = 1, uses_anonymous_args = 0
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #16
mov r3, #1
str r3, [fp, #-12]
mov r3, #2
str r3, [fp, #-16]
mov r3, #3
str r3, [fp, #-20]
ldr r3, [fp, #-12]
ldr r2, [fp, #-16]
mul r3, r2, r3
str r3, [fp, #-8]
ldr r0, .L3
sub r1, fp, #12
sub r2, fp, #16
sub r3, fp, #20
bl printf
mov r3, #0
mov r0, r3
sub sp, fp, #4
ldmfd sp!, {fp, pc}
2.去掉这一行 printf("%d, %d, %d", &i, &j, &k); 然后汇编后主要代码如下,发现1,2,3存放顺序与上面的相反
main:
@ args = 0, pretend = 0, frame = 16
@ frame_needed = 1, uses_anonymous_args = 0
@ link register save eliminated.
str fp, [sp, #-4]!
add fp, sp, #0
sub sp, sp, #20
mov r3, #1
str r3, [fp, #-20]
mov r3, #2
str r3, [fp, #-16]
mov r3, #3
str r3, [fp, #-12]
ldr r3, [fp, #-20]
ldr r2, [fp, #-16]
mul r3, r2, r3
str r3, [fp, #-8]
mov r3, #0
mov r0, r3
add sp, fp, #0
ldmfd sp!, {fp}
bx lr |