嵌入式培训学习历程第二十天

时间:2022-01-06 08:03:13

  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 (可变的)