如果您想使用检查生成的程序集方法,您可以这样做。
我假设您的两个函数被放入两个文件中,a.c
并且b.c
:
$ gcc -O0 -S a.c
$ gcc -O0 -S b.c
$ diff a.s b.s
1c1
< .file "a.c"
---
> .file "b.c"
13,14c13,14
< leaq -4(%rbp), %rsi
< leaq -8(%rbp), %rdi
---
> leaq -8(%rbp), %rsi
> leaq -4(%rbp), %rdi
17,18c17,18
< movl -8(%rbp), %edx
< movl -4(%rbp), %eax
---
> movl -4(%rbp), %edx
> movl -8(%rbp), %eax
$
我们关闭任何优化 (-O0) 以防止任何工件优化。
所以有点令人惊讶的是,这两个函数的 gcc (4.1.2) 输出略有不同。但是仔细观察一下,我们就会明白为什么 - 在第一个函数中,声明b
是 before a
,所以在堆栈上b
是 above a
,但在第二个函数中,它是相反的。
因此,如果我交换a
并且b
现在看到生成的程序集实际上是相同的:
$ gcc -O0 -S b1.c
$ diff a.s b1.s
1c1
< .file "a.c"
---
> .file "b1.c"
$
或者,如果您只关心生成的程序集是否不同,而不关心生成的程序集实际上是什么,那么您可以在一个fancy-schmancy bash 命令中完成这一切:
$ diff --brief <(cat a.c | gcc -O0 -S -xc - -o-) <(cat b.c | gcc -O0 -S -xc - -o-)
Files /dev/fd/63 and /dev/fd/62 differ
$ echo $?
1
$ diff --brief <(cat a.c | gcc -O0 -S -xc - -o-) <(cat b1.c | gcc -O0 -S -xc - -o-)
$ echo $?
0
$