1.段错误原因 : 访问了不存在的空间, 有空间但是么有权限
2.static : 在内存上开辟空间
3.objdump -dS a.out : 反汇编命令
4. gdb 中可以使用disassemble反汇编当前函数
注意 : 小权限转到大权限会出警告
5.p $esp : 打印esp的值。。
6.函数调用和返回过程的规则
(1). 参数压栈传递, 并且是从右向左依次压栈
(2). ebp总是指向当前栈帧的栈低
(3). 返回值通过eax寄存器传递
7. c语言的预处理器 cpp
8. _start 调用main函数 (_start 是汇编中的)
9. main.c -E main.i (预处理)
main.i -S main.s(编译)
main.s -o main.o(汇编)
main.o a.out (链接)
10.查看符号表nm或readelf -s
11.变量初始化或初始化为零放入.data段
变量无初始化放入.bss段
12.符号
两种一种强符号(已经初始化的全局变量, 函数的名字),一种弱符号(未初始化的全局变量)。
强到弱 : 弱自动退化成声明
强到强 : 报错
弱到弱 :什么事都可能发生
13. static 作用于全局变量,局部变量, 函数
可以使用 调用,,被static修饰的全局变量 get_timer 和 set_timer
14. .bss段在文件中不占存储空间,在加载时这个段用0填充, 全局变量如果不初始化则初值为零。
15.注意 :register :不能取地址
16. restrict不可变的,和volatile可变的
17. 作用域(scope)
函数作用域 : 标示符在整个函数中都有效
文件作用域 : 标示符从它声明的位置开始直到这个程序文件的末尾都有效
块作用域 : 从它声明的位置开始到右}括号之间有效
函数原型作用域 :标示符出现在函数原型(是声明不是定义),从声明位置开始到这个原型末尾之间有效
18. 对属于同一命名空间,的重名表示符,内层作用域的标示符讲覆盖外层作用域的表示符
语句标号单独属于一个命名空间
struct, enum, union类型Tag属于一个命名空间
struct, union的成员名属于一个命名空间
所有其它标示符都属于同一个命名空间
标示符的链接属性 :
外部链接, 内部链接, 无链接
19.static : 用它修饰的变量的存储空间是静态分配的
auto : 用它修饰的变量在调用的时候自动在栈上分配存储空间。。
register :尽可能分配一个寄存器来存储,如果不能当成auto变量处理
extern :用于多次声明同一个标示符
typedef : 定义一个类型名
21 . const , restrict, volatile : 类型限定符
22.变量生存期 :
静态生存期 :具有外部或内部链接,或者被static修饰的变量,在程序开始执行时分配和初始化一次, 以后便一直存在知道程序结束,通常位于, .rodata,.data, .bss段
自动生存期 :无属性链接,并且没有被static修饰的变量。进入块作用域在栈上或寄存器上分配,在退出块作用域时释放
动态分配生存期 : 在堆中分配空间,,通过free()函数释放。。
23.volatile 作用 : 修饰一个变量,(告诉系统变量是可变的,易变的)
24. 优化 : -os 优化大小 -01 -02 -03 优化速度。
英语 : disassemble (拆卸) restrict (不可变的) volatile (可变的)