對絕對位址的操作

2021-04-13 12:53:21 字數 1443 閱讀 2556

嵌入式系統中往往需要讓程式跳到記憶體的某個位址去執行,比如想讓程式跳轉到絕對位址是0x100000去執行,應該怎麼做?

這樣:*

((void(*

)(void

))0x100000

)();

即可。解釋一下,想讓程式跳到某個絕對位址去執行得用函式指標,這或許也是函式指標的乙個妙用吧!

語句void(*)(void)宣告了乙個返回值是void、無引數的函式的函式指標,這個指標沒有名字但有指向的位址。就是說位址0x100000是乙個返回值是void、無引數的函式的起始點,其實就是函式名,這裡也印證了函式名就是函式位址。拆開看看:

void(*

)(void

)0x100000

這個傢伙是個指標,函式的實際位址在它指向的地方,所以需要取內容,於是就*(void (*)(void)0x100000)。這樣一來這個表示式就是這個「函式的位址了」,也就是函式名,函式名後面打個括號加上引數就行了,於是最後就是*(void (*)(void)0x100000)()。

也可以這樣理解:

首先要將0x100000強制轉換成函式指標,即:

(void(*

)(void

))0x100000

然後再呼叫它:

((void(*

)(void

))0x100000

)();

用typedef可以看得更直觀些:

typedef 

void(*

)() voidfuncptr;

*((voidfuncptr)

0x100000

)();

你可能很快就會這樣做:

unsigned 

long*p 

=0x00001234

;//讀

intvar1 =*

p;//寫

*p =0x1111;

這樣不錯,不過你為了讀寫這四個位元組的區域宣告了乙個指標變數,指標變數本身佔4個位元組,如果p以後還有很多任務作也就罷了,如果它從此就不再使用了,那麼這樣做就純屬沒必要,還高的變數多看花了眼,可以這樣:

(*((unsigned 

long*)

0x00001234)) //讀

intvar =(

int)(*((

volatile

unsigned 

long*)

0x00001234

));//寫

*((volatile

unsigned 

long*)

0x00001234) =

0x1111;

嵌入式系統中常用的讀寫暫存器的方法就是這樣,比如:

#define

reg_1 (*((volatile unsigned long *)0x00001234))

那麼就可以隨意的操作暫存器reg_1了。

相對位址轉絕對位址

發乙個相對位址轉絕對位址的函式 今天在研究jquery ajax功能的時候遇到乙個問題,通過 load url a load乙個網頁的鏈結後獲取到的位址資訊是相對於當前執行ajax程式的網頁的絕對位址。比如我在 c x a.html 網頁執行 www.romotc.com 網頁中有乙個鏈結 a bo...

URI URL URN,相對位址 絕對位址

uri uniform resource identifier 標準資源標示符,可以進一步分為定位器 名稱,或者二者兼具 通過一定規則解碼可以得到資源位置 在html中的href採用的是uri引用 uri引用分為絕對引用和相對引用 絕對引用以方案名和冒號開頭,其他為相對引用 url uniform ...

相對位址和絕對位址

什麼是相對位址 document.location.href 就是相對位址跳轉,這個方法實現的是在當前路徑的基礎上進行跳轉 什麼是絕對位址 網路位址顧名思義就是直接跳轉到網路的位址,以http或者https等開頭的位址,這種位址可以直接跳轉到頁面 本地位址如果沒有特別說明在哪乙個盤,那麼所有的跳轉都...