解析c语言背后的汇编代码

时间:2022-03-01 14:50:44

源码


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

 #include <stdio.h>

 void swap(int * a, int * b) {
*a = *a + *b - (*b = *a);
return;
}

汇编代码解析


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

     .file    "test.c"
.text
.globl _swap
.def _swap; .scl 2; .type 32; .endef
_swap:
LFB6:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset
.cfi_offset , -
movl %esp, %ebp
.cfi_def_cfa_register
movl (%ebp), %eax --将a指向的地址放到寄存器eax中
movl (%eax), %edx --将a指向地址里面的值取出存入寄存器edx
movl (%ebp), %eax --将b指向的地址放到寄存器eax中
movl (%eax), %eax --取出b指向地址里面的值存入寄存器eax中
leal (%edx,%eax), %ecx --计算*a + *b的值并存入寄存器ecx
movl (%ebp), %eax --将a指向的地址放入eax
movl (%eax), %edx --取出a指向地址里面的值放入edx
movl (%ebp), %eax --将b指向的地址放入eax
movl %edx, (%eax) --用a指向地址里面的值覆盖b指向的地址里面的值. ps:(*b = *a)
movl (%ebp), %eax --将b指向的地址放入eax
movl (%eax), %eax --将b指向地址里面的值放入eax (ps:此时b指向的地址中存的值为a)
subl %eax, %ecx --用*a+*b的值减去b指向地址里面的值 (ps:此时b指向的地址里面的值为初始时的*a) ,结果(此时结果等于初始时b指针指向的值*b)存在ecx中
movl %ecx, %edx --将最终结果放入edx
movl (%ebp), %eax --将a指针地址放入eax

movl %edx, (%eax) --将a指针指向的值改为edx中的最终结果 ps: 此时a指针指向的值为初始时的*b,b指针指向的值为初始时的*a,a,b指针指向的结果已经互换过来了。
nop
popl %ebp
.cfi_restore
.cfi_def_cfa ,
ret
.cfi_endproc
LFE6:
.ident "GCC: (GNU) 4.8.1"