- 論壇徽章:
- 0
|
我做了如下的試驗(yàn):
源代碼:
#include <stdio.h>
int main()
{
unsigned int *addp = (unsigned int*)0x80000000;
int val1,val2;
val1 = *addp;
val2 = *addp;
return val1+val2*2;
}
arm-none-linux-gnueabi-gcc -O2 volatile_test.c -o volatile
arm-none-linux-gnueabi-objdump -D volatile > volatile.dmp
cat volatile.dmp:
000083fc <main>:
83fc: e3a03102 mov r3, #-2147483648 ; 0x80000000
8400: e5930000 ldr r0, [r3]---------------------->去到內(nèi)存,只取了一次值
8404: e0800080 add r0, r0, r0, lsl #1
8408: e12fff1e bx lr
將以上源代碼添加volatile關(guān)鍵字,修改如下:
#include <stdio.h>
int main()
{
volatile unsigned int *addp = (volatile unsigned int*)0x80000000;
int val1,val2;
val1 = *addp;
val2 = *addp;
return val1+val2*2;
}
重復(fù)執(zhí)行以上過(guò)程,反匯編,然后cat volatile.dmp:
000083fc <main>:
83fc: e3a03102 mov r3, #-2147483648 ; 0x80000000
8400: e5932000 ldr r2, [r3]------------------------->去到內(nèi)存取第一次值
8404: e5930000 ldr r0, [r3]------------------------->去到內(nèi)存取第二次值
8408: e0820080 add r0, r2, r0, lsl #1
840c: e12fff1e bx lr
注意以上的編譯過(guò)程,都需要加上優(yōu)化編譯開(kāi)關(guān):-O2
回復(fù) 4# unbutun
|
|