作者troylee (troylee)
看板LinuxDev
標題Re: [問題] 為何要使用asmlinkage?
時間Wed Nov 2 23:35:13 2011
※ 引述《mayasky ( )》之銘言:
: 不太一樣..volatile是說不要最佳化
: 例如對一些I/O mapping 的區段
: 你做最佳化就有可能有問題
: ex.
: compiler 會reorder
既然您都提到了 Memory Mapped I/O 就應該用這個來舉例摟~
Ex. 程式設定某 Register, 同時 MCU 的 I/O 也會去修改這個 Register
或是某個 Bit 對程式是 Read-only, 寫入 0/1 也不會更變他的值
所以 Compiler 預期你的 Register 在寫入後也不會揮發掉..
int NonVol()
{
char *RegA = (
char *)
0x40000000;
*RegA =
0x00;
if (
0x00 != *RegA)
{
return 1;
}
else
{
return 0;
}
}
int Vol()
{
volatile char *RegA = (
char *)
0x40000000;
*RegA =
0x00;
if (
0x00 != *RegA)
{
return 1;
}
else
{
return 0;
}
}
/* End of File */
$ gcc -O3 -S novol.c -o novol.s
這時聰明的 Compiler 會怎麼作最佳化呢?
NonVol:
.LFB13:
xorl %
eax, %
eax
movb $
0, 1073741824
ret ; 原本 if (*RegA == 0x00) 被最佳化掉,
; 因為 compiler 預期 0x40000000 不會被改變
; 所以直接回傳 eax == 0
Vol:
.LFB14:
movb $
0, 1073741824
movzbl 1073741824, %
eax
testb %
al, %
al
setne %
al
movzbl %
al, %
eax
ret
--
It is better to be approximately right than exactly wrong.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.116.91.238
※ 編輯: troylee 來自: 122.116.91.238 (11/02 23:38)
→ mayasky:我想他問的是function的declare...這才會對應到他的問題 11/04 00:59
→ mayasky:他問是否和asmlinkage一樣..這可以加變數前嗎? 11/04 01:00
→ mayasky:且教學最好的方式就是抽象化.發問人不一定懂x86 11/04 01:01
→ mayasky:且您似乎沒提到重點?就算是問變數的宣告 11/04 01:21
→ troylee:我的重點在最後最佳化後的組合語言, 很明顯看到第一個 11/04 01:30
→ troylee:function 最佳化後連判斷都不判斷了, 直接回傳 0 11/04 01:30
※ 編輯: troylee 來自: 122.116.91.238 (11/04 02:13)
→ clampsakura:其實volatile只是直接操作區域是記憶體. 而非用gpr 11/07 04:28
→ clampsakura:當作是temp. asmlinkage 要看asm code. 一般而言也不 11/07 04:29
→ clampsakura:一定要使用.只要你在asm中按照C規則去傳遞parameters 11/07 04:29