C语言高级编程:汇编分析i++和++i
生活随笔
收集整理的這篇文章主要介紹了
C语言高级编程:汇编分析i++和++i
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
測(cè)試環(huán)境: Ubuntu 14.04
?
1. 代碼
#include <stdio.h>int main() {int a;int b;int c;a = 1;b = a++;c = ++a;printf("b = %d, c = %d, a = %d\n", b, c, a); }?
2. 執(zhí)行
baoli@ubuntu:~/c$ ./a.out
b = 1, c = 3, a = 3
?
?
3. 反匯編
objdump -S a.out
注:編譯時(shí)加上-g
int main() {40052d: 55 push %rbp40052e: 48 89 e5 mov %rsp,%rbp400531: 48 83 ec 10 sub $0x10,%rspint a;int b;int c;a = 1;400535: c7 45 f4 01 00 00 00 movl $0x1,-0xc(%rbp)b = a++;40053c: 8b 45 f4 mov -0xc(%rbp),%eax40053f: 8d 50 01 lea 0x1(%rax),%edx400542: 89 55 f4 mov %edx,-0xc(%rbp)400545: 89 45 f8 mov %eax,-0x8(%rbp)c = ++a;400548: 83 45 f4 01 addl $0x1,-0xc(%rbp)40054c: 8b 45 f4 mov -0xc(%rbp),%eax40054f: 89 45 fc mov %eax,-0x4(%rbp)printf("b = %d, c = %d, a = %d\n", b, c, a);400552: 8b 4d f4 mov -0xc(%rbp),%ecx400555: 8b 55 fc mov -0x4(%rbp),%edx400558: 8b 45 f8 mov -0x8(%rbp),%eax40055b: 89 c6 mov %eax,%esi40055d: bf f4 05 40 00 mov $0x4005f4,%edi400562: b8 00 00 00 00 mov $0x0,%eax400567: e8 a4 fe ff ff callq 400410 <printf@plt> }?
4. 分析
1)b = a++
-
先將a的值保存到eax
-
再將rax(即eax)的值加1保存到edx
-
將edx寫回內(nèi)存a,即賦值給a
-
將eax寫到內(nèi)存b,及賦值給b
2)c = ++a
-
先將a的值加1
-
再將a的值保存到eax
-
將eax賦值給c
3)i++和++i最終都會(huì)使i的值加1
?
?
注:
|63..32|31..16|15-8|7-0|
???????????????|AH.|AL.|
???????????????|AX.....|
???????|EAX............|
|RAX...................|
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的C语言高级编程:汇编分析i++和++i的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 算法-无向图(连通分量,是否有环和二分图
- 下一篇: “诸葛马前课-小六壬&rdq