作者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)
1F:→ mayasky:我想他问的是function的declare...这才会对应到他的问题 11/04 00:59
2F:→ mayasky:他问是否和asmlinkage一样..这可以加变数前吗? 11/04 01:00
3F:→ mayasky:且教学最好的方式就是抽象化.发问人不一定懂x86 11/04 01:01
4F:→ mayasky:且您似乎没提到重点?就算是问变数的宣告 11/04 01:21
6F:→ troylee:我的重点在最後最佳化後的组合语言, 很明显看到第一个 11/04 01:30
7F:→ troylee:function 最佳化後连判断都不判断了, 直接回传 0 11/04 01:30
※ 编辑: troylee 来自: 122.116.91.238 (11/04 02:13)
8F:→ clampsakura:其实volatile只是直接操作区域是记忆体. 而非用gpr 11/07 04:28
9F:→ clampsakura:当作是temp. asmlinkage 要看asm code. 一般而言也不 11/07 04:29
10F:→ clampsakura:一定要使用.只要你在asm中按照C规则去传递parameters 11/07 04:29