當前位置:首頁 » 編程軟體 » 如何編譯函數到指定地址

如何編譯函數到指定地址

發布時間: 2022-05-30 09:54:39

1. c語言如何跳轉到指定的內存地址運行

為什麼要用指定的內存地址執行程序。
當然,c語言被編譯連接後肯定都是一條一條的指令。也肯定是存在內存中的。
那麼如果你是想跳到其他的程序的指令。那麼你的需求是有用的。
可是,很不幸。這樣的話,操作系統是不允許的,會報異常的。屬於內存越界錯誤,很明顯你創建的程序是無法訪問其他程序的指令的。
其次,如果你只是想跳到本身的c語言的某條指令的話。使用goto語句就可以實現。雖然是不鼓勵的。其次,規范好你的演算法實現。用循環和判斷完全能夠實現。如果那條指令是匯編編寫的程序的話。你也可以在c中嵌套匯編語言,jump到該指令。如果是匯編有關的話,跳轉指令應該經常會用的吧。

2. KEIL怎麼將函數放到指定地址

那要看你的Keil究竟是指51工具鏈還是ARM工具鏈。
如果是ARM,需要修改分散載入文件,在指定的位置新增Section,之後在你的程序中聲明將函數放在該Section中。
如果是51,那麼在選項卡的Linker頁面,在連接參數行添加參數,指定你那個函數塊的絕對地址就行。

3. 在ARM匯編編程中如何指定某段程序的存儲地址

在要指定代碼的存儲空間不是一件特別簡單的事情,尤其是你想為某個或某幾個函數指定具體的地址。
1,編譯器只有在最終的Link階段才會為代碼和數據分配內存地址,因此指定代碼段的地址一般是通過寫一個link腳本來進行的。Link階段時,編譯器的Linker會讀取你寫的Link腳本,並且按照腳本的規定給代碼分配地址。
2,根據ARM開發工具的不同,link腳本的語法和形式也有所不同。ARM MDK,ARM ADS,Eclips+GCC,Linux GCC, ARM Realview等開發工具都支持Link腳本。
如果你英文還可以,建議你直接找到開發工具的Help手冊去研究。如果你英語實在不行,也可以把開發工具名稱和你代碼的具體情況告訴我,我幫你看看。

4. c語言,在定義函數時,如何指定函數地址,即要求編譯器使用我指定的函數地址

extern void test(void)__attribute__((section(".ARM.__at_0x0001")));

5. 如何定義入口地址固定的函數

你說的for,我看出來你已經知道存在那些功能,但是還不知道某個功能是不是被實現了,下面又是一個例子:

FUN funs[16]={fun1,NULL,fun3};//假設我們知道最多也就16個功能,但是目前只有功能0和2被實現,功能1和其他的3~15都還沒有實現

for(...)
{
int funCode;
...
if(funs[funCode]!=NULL)//如果不是NULL,說明對應的功能號被實現了
funs[funCode](...)//調用
}
---------------------------------------------------------

樓主,C語言是不應該干這件事的!

樓主你的需求實際上可以這樣描述:
1 怎樣才能根據輸入條件來調用不同的函數
2 條件和函數是一一對應的,但是函數在哪是不確定的,例如可能是其他函數傳進來的。

我舉個簡單例子來解決你的問題
typedef void (*FUN)(...);//參數列表和返回值自己填

//定義一些功能函數
void fun1(...)
{
printf("1\n");
}

void fun2(...)
{
printf("1\n");
}
....
//上面的注意了,參數列表和返回值要一樣的

FUN funs[]={fun1,fun2,...};//把函數的指針放進數組,就像你C51的向量區,存放了許多函數的地址,這里最終放的也是地址,只不過等程序編譯好了才知道是多少,

...//一堆代碼

int funCode;//用來存放計算出來的功能代碼,例如0表示fun1,1表示fun2
...//一堆超級復雜而且重要且不可逃避的代碼之後,funCode被設為了某個值,這個這個值實際上是我精心而且故意設計為理解簡單的小玩意,代表某個功能的代碼。

funs[funCode](...)//調用功能函數(知道funCode需要精心設計了吧,funCode為0就調用了fun1),當然你也可以把funs傳到某個函數,然他也像這樣使用傳進去的函數。

6. 程序從編譯到運行經歷哪幾個階段.運行的時候怎麼找到函數的地址

C源程序到運行程序步驟:

  1. 編輯:輸入源程序並存檔(.C)

  2. 2.編譯:將源程序翻譯為目標文件(.OBJ)

  3. 3.鏈接:將目標文件生成可執行文件( .EXE)

  4. 4.運行:執行.EXE文件,得到運行結果

7. 怎麼把函數定位到指定的地址

移動物體到指定位置可用幾何作圖法解決。
1)在固定直線的端點為圓心畫一個半徑100的圓,
2)在該直線外取一點畫該直線的垂直線(捕捉垂足)
3)將垂直線移動過圓心(垂直線端點與圓心重合),得與圓相交的交點,
4)將另一條直線移動(直線端點與交點重合),
5)刪除圓及垂直線。

8. 如何將程序中的單獨某個函數寫入到flash中的特定地址

可以!前提是寫入的位置是空白沒有代碼的部分,調用庫函數: FLASH_Unlock(); //1、解鎖Flash FLASH_SetLatency(FLASH_Latency_2); //2、72MHz系統時鍾下設置兩個時鍾延時 FLASH_ErasePage(addr); //3、擦除指定的頁,addr是頁的起始地址

9. 如何給GCC指定編譯的地址

有兩種辦法
1. gcc D:\XXX\main.c 用這個命令來編譯你的C文件,把上面的目錄、文件換成你的。
2. 在CMD里,cd到D盤,然後cd到你的C文件目錄下,執行gcc main.c即可

10. c語言調用其他文件的函數怎麼編譯

調用函數庫的話用#include<XXX.h>或者#include"XXX.h"區別是你庫文件放在同一個文件夾還是在IDE的安裝目錄下面,如果你庫文件在你工程文件夾裡面用#include<XXX.h>,否則用#include"XXX.h"

如果你說自己寫庫的話是需要兩個宏命令,#ifndef_XXX_H#define_XXX_H,然後你函數名用extern表示

如果你說編譯的話,你應該說的是編譯原理吧,你可以反匯編一下一個編譯好的程序,如果該處編譯了一個其他函數庫的函數,你可以看到程序把參數PUSH到內存後CALL或者LCALL了一個這個函數的地址,這就完成了匯編中調用函數的部分,我記得X86裡面CALL的機器碼是E8H吧,有興趣的話可以自己用反匯編看一下

這個CALL的話就是調用函數的功能

熱點內容
學習編程青少年 發布:2024-05-21 13:27:19 瀏覽:708
mfc連接access資料庫 發布:2024-05-21 13:17:39 瀏覽:697
家裡網的密碼是多少 發布:2024-05-21 13:16:14 瀏覽:160
龍之谷交易所腳本 發布:2024-05-21 12:55:03 瀏覽:743
心理游戲編程 發布:2024-05-21 12:55:02 瀏覽:317
安卓哪個平板有高刷新率 發布:2024-05-21 12:47:06 瀏覽:126
sQliteAndroid事務 發布:2024-05-21 12:41:52 瀏覽:852
孕期計演算法 發布:2024-05-21 12:29:58 瀏覽:418
android虛擬事件 發布:2024-05-21 12:29:11 瀏覽:115
javaeffective 發布:2024-05-21 11:39:58 瀏覽:765