- C语言的基本结构
c语言的入口函数是main函数。
main函数的返回值行业标准是int
return 数字;返回值
每条语句最后以分号结尾
注释:行注释、块注释
int main(void) { // line comment /* * block comment * block comment */ }
- C语言数据类型
数据类型就是访问内存的方式
在64位机器上查看如下数据类型的内存访问方式:
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
- C语言指针
写如下程序观察指针
#include <stdio.h> int main() { int x = 257; char y ='k'; int *p = &x; printf("pointer lenth is %ld ", sizeof(p)); printf("*p is %d ", *p); printf("p is %lx ", p); printf("%p ", &x); printf("%p ", &y); printf("%p ", &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变量中
内存布局如下图:
未完待续…… - C语言部分语法