test3.c
- #include <stdio.h>
- void main()
- {
- int d = 4;
- char b = 2;
- d = b;
- }
然后编译:arm-linux-gnueabihf-gcc test.c -o test3 然后看看汇编代码:arm-linux-gnueabihf-objdump -D test3
0000835c <main>:
1 835c: b480 push {r7}
2 835e: b083 sub sp, #12
3 8360: af00 add r7, sp, #0
4 8362: f04f 0304 mov.w r3, #4
5 8366: 603b str r3, [r7, #0]
6 8368: f04f 0302 mov.w r3, #2
7 836c: 71fb strb r3, [r7, #7]
从栈里取出变量b的值赋给 r3:
8 836e: 79fb ldrb r3, [r7, #7]
跟新栈里的变量d的新的值--存储r3的值到stack里的变量d的位置:
9 8370: 603b str r3, [r7, #0]
10 8372: f107 070c add.w r7, r7, #12
11 8376: 46bd mov sp, r7
12 8378: bc80 pop {r7}
13 837a: 4770 bx lr
其中,1-7行以及10到13行与test2.c里代码相同,只有8-9行不同。从8-9行可以看出原来赋值运算 d = b 很简单:从从栈里(内存)加载( load ) 赋值运算符右边变量(b)的值到寄存器上,然后把此寄存器保存到赋值元算符左边变量(这里是d)的位置(在stack里)的内存里。请看示意图:
赋值前d的位置内存是4,b的位置内存是2
赋值后栈里变量d的位置的内存也变成了2 |