聲明:我剛開始使用x86彙編。我在大學學到了一點SPIM,但是這不值得一提。手動裝配vs GCC
我以爲我從libc,abs()中最簡單的函數開始。
long myAbs(long j) {
return j < 0 ? -j : j;
}
我的版本中裝配:用C非常簡單
.global myAbs
.type myAbs, @function
.text
myAbs:
test %rdi, %rdi
jns end
negq %rdi
end:
movq %rdi, %rax
ret
(這並不適用於32位整數的工作,可能是因爲RAX是一個64位的寄存器和標誌可能是在錯誤的位置 - 我必須調查)。
現在這裏是gcc在(GCC -02 -S myAbs.c):
.file "myAbs.c"
.section .text.unlikely,"ax",@progbits
.LCOLDB0:
.text
.LHOTB0:
.p2align 4,,15
.globl myAbs
.type myAbs, @function
myAbs:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $4144, %rsp
orq $0, (%rsp)
addq $4128, %rsp
movq %rdi, %rdx
sarq $63, %rdx
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movq %rdi, %rax
xorq %rdx, %rax
subq %rdx, %rax
movq -8(%rbp), %rcx
xorq %fs:40, %rcx
jne .L5
leave
.cfi_remember_state
.cfi_def_cfa 7, 8
ret
.L5:
.cfi_restore_state
call [email protected]
.cfi_endproc
.LFE0:
.size myAbs, .-myAbs
.section .text.unlikely
.LCOLDE0:
.text
.LHOTE0:
.ident "GCC: (Gentoo Hardened 5.1.0 p1.2, pie-0.6.3) 5.1.0"
.section .note.GNU-stack,"",@progbits
爲什麼這樣大的差別?海灣合作委員會產生更多的指示我無法想象這不會比我的代碼慢。 我錯過了什麼嗎?或者我在這裏做了一些嚴重錯誤的事情?
也許你的海灣合作委員會感到不適?礦產生[減少指令](https://goo.gl/wG2v1X)。 (和Clang喜歡[有條件的移動](https://goo.gl/xpxKyi)。) –
「GCC :(Gentoo硬化5.1.0 p1.2,餅-0.6.3)5.1.0」 - 我認爲這是線索。強化的C編譯器集成了堆棧粉碎保護或類似的功能。 – davmac
許多開始的調用是設置堆棧並保存返回地址(你沒有做的事情)。看起來像是一些堆棧保護正在進行。也許你可以調整你的編譯器設置以消除一些開銷。 – carloabelli