zoukankan      html  css  js  c++  java
  • 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
      ", 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变量中

      内存布局如下图:

      未完待续……
    4. C语言部分语法
  • 相关阅读:
    关于数据库的索引知识
    RESTful API设计相关
    Coroutine(协程)模式与线程
    Python网络编程中的服务器架构(负载均衡、单线程、多线程和同步、异步等)
    读懂diff
    Linux学习笔记——如何使用echo指令向文件写入内容
    ubuntu中执行定时任务crontab
    网络编程之异步IO,rabbitMQ笔记
    走进docker的世界之入门篇
    xml基础
  • 原文地址:https://www.cnblogs.com/turing-apple/p/4912937.html
Copyright © 2011-2022 走看看