源碼ide
很簡單的c語言代碼,做用是交換兩個數:spa
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 命令生成相關彙編代碼。rest
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"