1. C语言的基本结构

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

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

    return 数字;返回值

    每条语句最后以分号结尾

    注释:行注释、块注释

    int main(void)
    {
    // line comment
    /*
    * block comment
    * block comment
    */
    }
  2. C语言数据类型
    数据类型就是访问内存的方式
    在64位机器上查看如下数据类型的内存访问方式:
    int main(void)
    {
    char ci = ; // 1个字节,8位,BYTE
    char csum = ci + ; short si = ; // 2个字节,16位,WORD
    short sum = si + ; int ii = ; // 4个字节,32位,DWORD (double word)
    int isum = ii + ; long long li = ; // 8个字节,64位,QWORD (quater word)
    long long lsum = li + ;
    }

    使用命令

    objdump -d -M interl a.out

    按intel的汇编指令格式查看反汇编结果如下:

    4004ed:                           push   rbp
    4004ee: e5 mov rbp,rsp
    4004f1: c6 e2 mov BYTE PTR [rbp-0x1e],0x8
    4004f5: 0f b6 e2 movzx eax,BYTE PTR [rbp-0x1e] ; 把8位数据复制到32寄存器,位数不够的用0填充
    4004f9: c0 add eax,0x8
    4004fc: e3 mov BYTE PTR [rbp-0x1d],al ; 把eax的低8位数据复制到栈
    4004ff: c7 e4 mov WORD PTR [rbp-0x1c],0x10
    : 0f b7 e4 movzx eax,WORD PTR [rbp-0x1c] ; 把16位数据复制到32寄存器,位数不够的用0填充
    : c0 add eax,0x10
    40050c: e6 mov WORD PTR [rbp-0x1a],ax ; 把eax的低16位数据复制到栈
    : c7 e8 mov DWORD PTR [rbp-0x18],0x20
    : 8b e8 mov eax,DWORD PTR [rbp-0x18] ; 把32位数据复制到32位寄存器
    40051a: c0 add eax,0x20
    40051d: ec mov DWORD PTR [rbp-0x14],eax
    : c7 f0 mov QWORD PTR [rbp-0x10],0x40
    :
    : 8b f0 mov rax,QWORD PTR [rbp-0x10] ; 把8个字节的数据复制到rax寄存器,rax是64位寄存器
    40052c: c0 add rax,0x40
    : f8 mov QWORD PTR [rbp-0x8],rax
    : 5d pop rbp
  3. C语言指针
    写如下程序观察指针
    #include <stdio.h>
    
    int main()
    {
    int x = ;
    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: push rbp
    40052e: e5 mov rbp,rsp
    : ec sub rsp,0x10
    int x = ;
    : c7 f4 mov DWORD PTR [rbp-0xc],0x101 ; 4字节大小的数据会对齐到能整除4的内存地址上
    char y ='k';
    40053c: c6 f3 6b mov BYTE PTR [rbp-0xd],0x6b ; char为1字节,所以没有对齐的要求
    int *p = &x;
    : 8d f4 lea rax,[rbp-0xc] ; 将x的地址放到rax寄存器
    : f8 mov QWORD PTR [rbp-0x8],rax ; 再放到p变量中

    内存布局如下图:

    0基础学习ios开发笔记第二天-LMLPHP

    未完待续……

  4. C语言部分语法
05-11 22:08