zoukankan      html  css  js  c++  java
  • 解析c语言背后的汇编代码

    源码


     很简单的c语言代码,作用是交换两个数:

    1 #include <stdio.h>
    2 
    3 void swap(int * a, int * b) {
    4     *a = *a + *b - (*b = *a);
    5     return;
    6 }

    汇编代码解析 


      在gcc编译环境下执行, gcc -S  -o test.s test.c 命令生成相关汇编代码。

     1     .file    "test.c"
     2     .text
     3     .globl    _swap
     4     .def    _swap;    .scl    2;    .type    32;    .endef
     5 _swap:
     6 LFB6:
     7     .cfi_startproc
     8     pushl    %ebp
     9     .cfi_def_cfa_offset 8
    10     .cfi_offset 5, -8
    11     movl    %esp, %ebp
    12     .cfi_def_cfa_register 5
    13     movl    8(%ebp), %eax          --将a指向的地址放到寄存器eax中
    14     movl    (%eax), %edx           --将a指向地址里面的值取出存入寄存器edx
    15     movl    12(%ebp), %eax         --将b指向的地址放到寄存器eax中
    16     movl    (%eax), %eax           --取出b指向地址里面的值存入寄存器eax中
    17     leal    (%edx,%eax), %ecx      --计算*a + *b的值并存入寄存器ecx
    18     movl    8(%ebp), %eax          --将a指向的地址放入eax
    19     movl    (%eax), %edx           --取出a指向地址里面的值放入edx
    20     movl    12(%ebp), %eax         --将b指向的地址放入eax 
    21     movl    %edx, (%eax)           --用a指向地址里面的值覆盖b指向的地址里面的值. ps:(*b = *a)
    22     movl    12(%ebp), %eax         --将b指向的地址放入eax
    23     movl    (%eax), %eax           --将b指向地址里面的值放入eax (ps:此时b指向的地址中存的值为a)
    24     subl    %eax, %ecx             --用*a+*b的值减去b指向地址里面的值 (ps:此时b指向的地址里面的值为初始时的*a) ,结果(此时结果等于初始时b指针指向的值*b)存在ecx中
    25     movl    %ecx, %edx             --将最终结果放入edx
    26     movl    8(%ebp), %eax          --将a指针地址放入eax
    27 movl %edx, (%eax) --将a指针指向的值改为edx中的最终结果 ps: 此时a指针指向的值为初始时的*b,b指针指向的值为初始时的*a,a,b指针指向的结果已经互换过来了。 28 nop 29 popl %ebp 30 .cfi_restore 5 31 .cfi_def_cfa 4, 4 32 ret 33 .cfi_endproc 34 LFE6: 35 .ident "GCC: (GNU) 4.8.1"
  • 相关阅读:
    HDU 2594 Simpsons’ Hidden Talents(辛普森一家的潜在天赋)
    HUD 2203 亲和串
    POJ 3461 Oulipo(乌力波)
    FJNU 1154 Fat Brother And His Love(胖哥与女神)
    Polygon Triangles
    Double it(水题模拟+逆向思维)
    Sphenic numbers(素数筛)
    Desktop(模拟)2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest
    Weather Station(基础DP)2016-2017 ACM Central Region of Russia Quarterfinal Programming Contest
    找零钱(经典DP)
  • 原文地址:https://www.cnblogs.com/tarbitrary/p/4065534.html
Copyright © 2011-2022 走看看