c語言的入口函數是main函數。
main函數的返回值行業標準是int
return 數字;返回值
每條語句最后以分號結尾
注釋:行注釋、塊注釋
int main(void){ // line comment /* * block comment * block comment */}
int main(void){ char ci = 8; // 1個字節,8位,BYTE char csum = ci + 8; short si = 16; // 2個字節,16位,Word short sum = si + 16; int ii = 32; // 4個字節,32位,DWORD (double word) int isum = ii + 32; long long li = 64; // 8個字節,64位,QWORD (quater word) long long lsum = li + 64;}
objdump -d -M interl a.out
4004ed: 55 push rbp 4004ee: 48 89 e5 mov rbp,rsp 4004f1: c6 45 e2 08 mov BYTE PTR [rbp-0x1e],0x8 4004f5: 0f b6 45 e2 movzx eax,BYTE PTR [rbp-0x1e] ; 把8位數據復制到32寄存器,位數不夠的用0填充 4004f9: 83 c0 08 add eax,0x8 4004fc: 88 45 e3 mov BYTE PTR [rbp-0x1d],al ; 把eax的低8位數據復制到棧 4004ff: 66 c7 45 e4 10 00 mov WORD PTR [rbp-0x1c],0x10 400505: 0f b7 45 e4 movzx eax,WORD PTR [rbp-0x1c] ; 把16位數據復制到32寄存器,位數不夠的用0填充 400509: 83 c0 10 add eax,0x10 40050c: 66 89 45 e6 mov WORD PTR [rbp-0x1a],ax ; 把eax的低16位數據復制到棧 400510: c7 45 e8 20 00 00 00 mov DWORD PTR [rbp-0x18],0x20 400517: 8b 45 e8 mov eax,DWORD PTR [rbp-0x18] ; 把32位數據復制到32位寄存器 40051a: 83 c0 20 add eax,0x20 40051d: 89 45 ec mov DWORD PTR [rbp-0x14],eax 400520: 48 c7 45 f0 40 00 00 mov QWORD PTR [rbp-0x10],0x40 400527: 00 400528: 48 8b 45 f0 mov rax,QWORD PTR [rbp-0x10] ; 把8個字節的數據復制到rax寄存器,rax是64位寄存器 40052c: 48 83 c0 40 add rax,0x40 400530: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax 400534: 5d pop rbp
#include <stdio.h>int main(){ int x = 257; char y ='k'; int *p = &x; PRintf("pointer lenth is %ld/n", sizeof(p)); printf("*p is %d/n", *p); printf("p is %lx/n", p); printf("%p/n", &x); printf("%p/n", &y); printf("%p/n", &p);}
編譯程序時加上-g參數可以加入調試符號信息,同時objdump -S的時候也可以把反匯編代碼和C源碼對應起來
使用命令
objdump -d -M intel -S a.out
查看反匯編代碼部分如下:
typedef int * int_p;int main(){ 40052d: 55 push rbp 40052e: 48 89 e5 mov rbp,rsp 400531: 48 83 ec 10 sub rsp,0x10 int x = 257; 400535: c7 45 f4 01 01 00 00 mov DWORD PTR [rbp-0xc],0x101 ; 4字節大小的數據會對齊到能整除4的內存地址上 char y ='k'; 40053c: c6 45 f3 6b mov BYTE PTR [rbp-0xd],0x6b ; char為1字節,所以沒有對齊的要求 int *p = &x; 400540: 48 8d 45 f4 lea rax,[rbp-0xc] ; 將x的地址放到rax寄存器 400544: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax ; 再放到p變量中
內存布局如下圖:
新聞熱點
疑難解答