你的位置:首页 > 操作系统

[操作系统]0基础学习ios开发笔记第二天


  1. C语言的基本结构

    c语言的入口函数是main函数。

    main函数的返回值行业标准是int

    return 数字;返回值

    每条语句最后以分号结尾

    注释:行注释、块注释

    int main(void){  // line comment  /*   * block comment                                                         * block comment  */}

  2. 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

    按intel的汇编指令格式查看反汇编结果如下:
    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

     

  3. C语言指针
    写如下程序观察指针
    #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变量中

     

    内存布局如下图:

    未完待续……
  4. C语言部分语法