如果您想要檢查生成的裝配方法,請按照以下步驟操作。
我假設你的兩個功能被放入兩個文件,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
的聲明在a
之前,因此b
在堆棧上的a
以上,但在第二個函數中,它是相反的。
所以,如果我換a
和b
我現在看到生成的組件實際上是相同的:
$ gcc -O0 -S b1.c
$ diff a.s b1.s
1c1
< .file "a.c"
---
> .file "b1.c"
$
另外,如果你只關心生成的程序集是否是不同的,而不是什麼生成的程序集實際上是,那麼你就可以做到這一切在一個花式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
$
檢查它是否符合相同的asm? – user2802841
@ user2802841這確實是一個選項。我們必須牢記,它很容易產生假陰性。 – Angew
爲了真正證明這些變體是功能上相同的(即做同樣的事情),使用迴歸測試。 –