首先建立工程開始開啟ads->codeWarrior
File->New->Project->ARM Executable Image 選擇工程目錄建立的是*.mcp工程檔案
接下和vc一樣建立檔案這裡檔案 .s(asm彙編檔案).c(標準c).cpp(c++檔案)
注意不同檔案調用的編譯器不同所以注意檔案尾碼名
建一個Init.s入口初始檔案所有調用將從這個檔案入口
File->New->File->TextFile 選擇目錄建立檔案init.s
下面是代碼(我做了精簡)
IMPORT Main //注意命令列是不能頂格的否則編譯不認作業碼 倒入函數類似include概念
AREA Init,CODE,READONLY //這是宏彙編文法表示程式碼片段名稱及屬性READONLY
ENTRY //入口宏
LDR R13, =0x8000 //定義SP
B Main //跳轉到Main開始正式的c檔案下操作
END //結束宏
再同樣建立一個testlib.s測試lib的庫 書寫一個strcpy函數
EXPORT strcpy //匯出lib中的函數名類似於extern或者public功能
AREA TESTLIB,CODE,READONLY //同上
strcpy //標號定義必須頂格
LDRB r2, [r1, #0] //下面是實現strcpy過程
CMP r2, #0
BEQ cpy_end
add r1, r1, #1
STRB r2, [r0], #1
B strcpy
cpy_end
mov r0, #1
mov pc, r14 //實現結束
END
同樣建立main.c的主c檔案
書寫代碼
int Main() //看到Main了麼,與標準c不同可以自己定義入口
{
char buf[10] = {0}; //同標準c下書寫一樣不過所有庫函數要自己實現當然不是指strcpy這些
//是對於printf,串口之類硬體的
char *pstr = "123456789";
strcpy( buf, pstr); //調用
return 1;
}
整個就完成了可以編譯然後運行使用AXD進入調試階段自己搞
介紹一下ACPS
APCS,ARM 程序呼叫標準(ARM Procedure Call Standard),提供了緊湊的編寫常式的一種機制,定義的常式可以與其他常式交織在一起。最顯著的一點是對這些常式來自哪裡沒有明確的限制。它們可以編譯自 C、 Pascal、也可以是用組合語言寫成的。
APCS 定義了:
對寄存器使用的限制。
使用棧的慣例。
在函數調用之間傳遞/返回參數。
可以被‘回溯’的基於棧的結構的格式,用來提供從失敗點到程式入口的函數(和給予的參數)的列表。
APCS 標準
總的來說,有多個版本的 APCS (實際上是 16 個)。我們只關心在 RISC OS 上可能遇到的。
APCS-A
就是 APCS-Arthur;由早期的 Arthur 所定義。它已經被廢棄,原因是它有不同的寄存器定義(對於熟練的 RISC OS 程式員它是某種異類)。它用於在 USR 模式下啟動並執行 Arthur 應用程式。不應該使用它。
sl = R13, fp = R10, ip = R11, sp = R12, lr = R14, pc = R15。
PRM (p4-411) 中說“用 r12 作為 sp,而不是在體繫上更自然的 r13,是曆史性的並先於 Arthur 和 RISC OS 二者。”
棧是分段的並可按需要來擴充。
26-bit 程式計數器。
不在 FP 寄存器中傳遞浮點實參。
不可重新進入。標誌必須被恢複。
APCS-R
就是 APCS-RISC OS。用於 RISC OS 應用程式在 USR 模式下進行操作;或在 SVC 模式下的模組/處理常式。
sl = R10, fp = R11, ip = R12, sp = R13, lr = R14, pc = R15。
它是唯一的最通用的 APCS 版本。因為所有編譯的 C 程式都使用 APCS-R。
顯式的棧限制檢查。
26-bit 程式計數器。
不在 FP 寄存器中傳遞浮點實參。
不可重新進入。標誌必須被恢複。
APCS-U
就是 APCS-Unix,Acorn 的 RISCiX 使用它。它用於 RISCiX 應用程式(USR 模式)或核心(SVC 模式)。
sl = R10, fp = R11, ip = R12, sp = R13, lr = R14, pc = R15。
隱式的棧限制檢查(使用 sl)。
26-bit 程式計數器。
不在 FP 寄存器中傳遞浮點實參。
不可重新進入。標誌必須被恢複。
APCS-32
它是 APCS-2(-R 和 -U)的一個擴充,允許 32-bit 程式計數器,並且從執行在 USR 模式下的一個函數中退出時,允許標誌不被恢複。其他事情同於 APCS-R。
Acorn C 版本 5 支援產生 32-bit 代碼;在用於廣域調試的 32 位工具中,它是最完整的開發發行。一個簡單的測試是要求你的編譯器匯出彙編源碼(而不是製作目標代碼)。你不應該找到:
MOVS PC, R14
或者
LDMFD R13!, {Rx-x, PC}