解析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"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM