美文网首页
clang000-2019-03-21

clang000-2019-03-21

作者: 烽火扬州 | 来源:发表于2019-04-05 19:31 被阅读0次

    1.1

    #include <stdio.h>
    int main() {
        return 0;
    }
    
    (gdb) disas
            Dump of assembler code for function main:
    0x00000000004004d6 <+0>:    push   %rbp
    0x00000000004004d7 <+1>:    mov    %rsp,%rbp        建立堆栈
    0x00000000004004da <+4>:    mov    $0x0,%eax        返回值0
    0x00000000004004df <+9>:    pop    %rbp
    0x00000000004004e0 <+10>:   retq
            End of assembler dump.
    

    1.2

    #include <stdio.h>
    int main() {
        return 10;
    }
    
    Dump of assembler code for function main:
       0x00000000004004d6 <+0>: push   %rbp
       0x00000000004004d7 <+1>: mov    %rsp,%rbp
    => 0x00000000004004da <+4>: mov    $0xa,%eax
       0x00000000004004df <+9>: pop    %rbp
       0x00000000004004e0 <+10>:    retq   
    End of assembler dump.
    

    2.1

    #include <stdio.h>
    void fun1() {
    }
    
    int main() {
        fun1();
        return 10;
    }
    
    Dump of assembler code for function main:
       0x00000000004004dd <+0>: push   %rbp
       0x00000000004004de <+1>: mov    %rsp,%rbp
       0x00000000004004e1 <+4>: mov    $0x0,%eax
       0x00000000004004e6 <+9>: callq  0x4004d6 <fun1>
    => 0x00000000004004eb <+14>:    mov    $0xa,%eax
       0x00000000004004f0 <+19>:    pop    %rbp
       0x00000000004004f1 <+20>:    retq   
    End of assembler dump.
    
    Dump of assembler code for function fun1:
       0x00000000004004d6 <+0>: push   %rbp
       0x00000000004004d7 <+1>: mov    %rsp,%rbp
    => 0x00000000004004da <+4>: nop
       0x00000000004004db <+5>: pop    %rbp
       0x00000000004004dc <+6>: retq   
    End of assembler dump.
    

    2.2

    #include <stdio.h>
    
    int fun1() {
        return 16;
    }
    
    int main() {
        fun1();
        return 10;
    }
    
    Dump of assembler code for function fun1:
       0x00000000004004d6 <+0>: push   %rbp
       0x00000000004004d7 <+1>: mov    %rsp,%rbp
       0x00000000004004da <+4>: mov    $0x10,%eax
       0x00000000004004df <+9>: pop    %rbp
       0x00000000004004e0 <+10>:    retq   
    End of assembler dump.
    Dump of assembler code for function main:
       0x00000000004004e1 <+0>: push   %rbp
       0x00000000004004e2 <+1>: mov    %rsp,%rbp
       0x00000000004004e5 <+4>: mov    $0x0,%eax
       0x00000000004004ea <+9>: callq  0x4004d6 <fun1>
    => 0x00000000004004ef <+14>:    mov    $0xa,%eax
       0x00000000004004f4 <+19>:    pop    %rbp
       0x00000000004004f5 <+20>:    retq   
    End of assembler dump.
    

    2.3

    #include <stdio.h>
    
    int fun1(int m) {
        return m;
    }
    
    int main() {
        fun1(16);
        return 10;
    }
    
    Dump of assembler code for function fun1:
       0x00000000004004d6 <+0>: push   %rbp
       0x00000000004004d7 <+1>: mov    %rsp,%rbp
       0x00000000004004da <+4>: mov    %edi,-0x4(%rbp)
       0x00000000004004dd <+7>: mov    -0x4(%rbp),%eax
       0x00000000004004e0 <+10>:    pop    %rbp
       0x00000000004004e1 <+11>:    retq   
    End of assembler dump.
    Dump of assembler code for function main:
       0x00000000004004e2 <+0>: push   %rbp
       0x00000000004004e3 <+1>: mov    %rsp,%rbp
       0x00000000004004e6 <+4>: mov    $0x10,%edi
       0x00000000004004eb <+9>: callq  0x4004d6 <fun1>
    => 0x00000000004004f0 <+14>:    mov    $0xa,%eax
       0x00000000004004f5 <+19>:    pop    %rbp
       0x00000000004004f6 <+20>:    retq   
    End of assembler dump.
    

    2.4

    #include <stdio.h>
    
    int fun1(int m) {
        return m;
    }
    
    int main() {
        int a;
        a = fun1(16);
        return 10;
    }
    
    Dump of assembler code for function fun1:
       0x00000000004004d6 <+0>: push   %rbp
       0x00000000004004d7 <+1>: mov    %rsp,%rbp
       0x00000000004004da <+4>: mov    %edi,-0x4(%rbp)
    => 0x00000000004004dd <+7>: mov    -0x4(%rbp),%eax
       0x00000000004004e0 <+10>:    pop    %rbp
       0x00000000004004e1 <+11>:    retq   
    End of assembler dump.
    Dump of assembler code for function main:
       0x00000000004004e2 <+0>: push   %rbp
       0x00000000004004e3 <+1>: mov    %rsp,%rbp
       0x00000000004004e6 <+4>: sub    $0x10,%rsp
       0x00000000004004ea <+8>: mov    $0x10,%edi
       0x00000000004004ef <+13>:    callq  0x4004d6 <fun1>
       0x00000000004004f4 <+18>:    mov    %eax,-0x4(%rbp)
    => 0x00000000004004f7 <+21>:    mov    $0xa,%eax
       0x00000000004004fc <+26>:    leaveq 
       0x00000000004004fd <+27>:    retq   
    End of assembler dump.
    

    3.1

    printf("*******%s,%s,%d*******\n",__FUNCTION__,__FILE__,__LINE__);

    #include <stdio.h>
    #define NUM 100
    int main(){
    #ifdef DEBUG
            printf("*******%s,%s,%d*******\n",__FUNCTION__,__FILE__,__LINE__);
    #endif
            printf("Hello!\n");
            return 0;
    }
    
    root@vultr:~/clang# ls
    002.c
    root@vultr:~/clang# gcc -DDEBUG -o 002 002.c 
    root@vultr:~/clang# ls
    002  002.c
    root@vultr:~/clang# ./002
    *******main,002.c,5*******
    Hello!
    root@vultr:~/clang# rm 002
    root@vultr:~/clang# ls
    002.c
    root@vultr:~/clang# gcc -o 002 002.c
    root@vultr:~/clang# ls
    002  002.c
    root@vultr:~/clang# ./002
    Hello!
    root@vultr:~/clang# ^C
    root@vultr:~/clang# 
    

    3.2

    ANSI C一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
    C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。

    关键字 sizeof,非函数!所以在任何环境下都可以使用。
    关键字 return,函数返回。

    char int short long unsigned signed float double void
    struct union enum typedef,定义数据类型,圈地用的。

    ifelse
    switchcasedefault
    dowhilefor
    continuebreakgoto,逻辑结构,控制干活儿的顺序:顺序执行、分支执行、循环执行。

    autoregisterstaticconstexternvolatile,类型修饰符,(修饰数据类型,用来修饰上面那些个限制内存大小的数据类型),对内存资源存放位置的限定。

    部分关键字解释:break:跳出当前循环
    continue:结束当前循环,开始下一轮循环
    case:开关语句分支
    default:开关语句中的“其它”分支
    goto:无条件跳转语句
    return :子程序返回语句(可以带参数,也可不带参数)
    register:声明寄存器变量
    sizeof:计算数据类型或变量长度(即所占字节数)
    volatile:说明变量在程序执行中可被隐含地改变
    auto :声明自动变量
    extern:声明变量或函数是在其它文件或本文件的其他位置定义

    Relevant Link:
    c语言关键字总结 - 二郎三郎 - 博客园

    算术操作运算:
    + - * / %
    逻辑运算(返回结果0或1,假就是零,非零就是真):
    || &&
    > >= < <=
    !
    ? :
    位运算:
    << >>
    | &
    ^ ~
    赋值运算:
    =
    += -= &= ...
    内存访问符号:
    ()
    []
    {}
    -> .
    & *

    Relevant Link:
    异或运算的性质及用途 - 氏名無 - CSDN博客

    3.3

    register关键字

    //"register.c"
    #include <stdio.h>
    int main(){
            register int a;
            a=0x10;
            printf("the a is %d\n",a);
            return 0;
    }
    
    //"register2.c"
    #include <stdio.h>
    int main(){
            int a;
            a=0x10;
            printf("the a is %d\n",a);
            return 0;
    }
    
    root@vultr:~/clang# ls
    register2.c  register.c
    root@vultr:~/clang# gcc -o register register.c
    root@vultr:~/clang# gcc -o register2 register2.c 
    root@vultr:~/clang# ls
    register  register2  register2.c  register.c
    root@vultr:~/clang# ./register
    the a is 16
    root@vultr:~/clang# ./register2
    the a is 16
    root@vultr:~/clang# rm register register2
    
    root@vultr:~/clang# ls
    register2.c  register.c
    root@vultr:~/clang# gcc -c -o register register.c
    root@vultr:~/clang# gcc -c -o register2 register2.c
    root@vultr:~/clang# ls
    register  register2  register2.c  register.c
    root@vultr:~/clang# objdump -d register
    
    register:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <main>:
       0:   55                      push   %rbp
       1:   48 89 e5                mov    %rsp,%rbp
       4:   53                      push   %rbx
       5:   48 83 ec 08             sub    $0x8,%rsp
       9:   bb 10 00 00 00          mov    $0x10,%ebx
       e:   89 de                   mov    %ebx,%esi
      10:   bf 00 00 00 00          mov    $0x0,%edi
      15:   b8 00 00 00 00          mov    $0x0,%eax
      1a:   e8 00 00 00 00          callq  1f <main+0x1f>
      1f:   b8 00 00 00 00          mov    $0x0,%eax
      24:   48 83 c4 08             add    $0x8,%rsp
      28:   5b                      pop    %rbx
      29:   5d                      pop    %rbp
      2a:   c3                      retq   
    root@vultr:~/clang# objdump -d register2
    
    register2:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <main>:
       0:   55                      push   %rbp
       1:   48 89 e5                mov    %rsp,%rbp
       4:   48 83 ec 10             sub    $0x10,%rsp
       8:   c7 45 fc 10 00 00 00    movl   $0x10,-0x4(%rbp)
       f:   8b 45 fc                mov    -0x4(%rbp),%eax
      12:   89 c6                   mov    %eax,%esi
      14:   bf 00 00 00 00          mov    $0x0,%edi
      19:   b8 00 00 00 00          mov    $0x0,%eax
      1e:   e8 00 00 00 00          callq  23 <main+0x23>
      23:   b8 00 00 00 00          mov    $0x0,%eax
      28:   c9                      leaveq 
      29:   c3                      retq   
    root@vultr:~/clang# 
    

    3.4

    //"shiftr.c"
    #include <stdio.h>
    int main(){
            int a=32;
            while(a){
               a=a>>1;
            }
            printf("**************\n");
    }
    
    root@vultr:~/clang# gcc -o shiftr shiftr.c 
    root@vultr:~/clang# ls
    shiftr  shiftr.c
    root@vultr:~/clang# ./shiftr 
    **************
    root@vultr:~/clang# gcc -c -o shiftr.o shiftr.c 
    root@vultr:~/clang# ls
    shiftr  shiftr.c  shiftr.o
    root@vultr:~/clang# objdump -d shiftr.o
    
    shiftr.o:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <main>:
       0:   55                      push   %rbp
       1:   48 89 e5                mov    %rsp,%rbp
       4:   48 83 ec 10             sub    $0x10,%rsp
       8:   c7 45 fc 20 00 00 00    movl   $0x20,-0x4(%rbp)
       f:   eb 03                   jmp    14 <main+0x14>
      11:   d1 7d fc                sarl   -0x4(%rbp)
      14:   83 7d fc 00             cmpl   $0x0,-0x4(%rbp)
      18:   75 f7                   jne    11 <main+0x11>
      1a:   bf 00 00 00 00          mov    $0x0,%edi
      1f:   e8 00 00 00 00          callq  24 <main+0x24>
      24:   b8 00 00 00 00          mov    $0x0,%eax
      29:   c9                      leaveq 
      2a:   c3                      retq   
    root@vultr:~/clang# 
    

    修改为int a=-32;,会让程序陷入死循环。

    root@vultr:~/clang# gcc -o shiftr shiftr.c 
    root@vultr:~/clang# ./shiftr 
    ^C
    root@vultr:~/clang# gcc -c -o shiftr.o shiftr.c 
    root@vultr:~/clang# ls
    shiftr  shiftr.c  shiftr.o
    root@vultr:~/clang# objdump -d shiftr.o
    
    shiftr.o:     file format elf64-x86-64
    
    
    Disassembly of section .text:
    
    0000000000000000 <main>:
       0:   55                      push   %rbp
       1:   48 89 e5                mov    %rsp,%rbp
       4:   48 83 ec 10             sub    $0x10,%rsp
       8:   c7 45 fc e0 ff ff ff    movl   $0xffffffe0,-0x4(%rbp)
       f:   eb 03                   jmp    14 <main+0x14>
      11:   d1 7d fc                sarl   -0x4(%rbp)
      14:   83 7d fc 00             cmpl   $0x0,-0x4(%rbp)
      18:   75 f7                   jne    11 <main+0x11>
      1a:   bf 00 00 00 00          mov    $0x0,%edi
      1f:   e8 00 00 00 00          callq  24 <main+0x24>
      24:   b8 00 00 00 00          mov    $0x0,%eax
      29:   c9                      leaveq 
      2a:   c3                      retq   
    root@vultr:~/clang# 
    

    相关文章

      网友评论

          本文标题:clang000-2019-03-21

          本文链接:https://www.haomeiwen.com/subject/hodcvqtx.html