arm混合編譯實例
『壹』 ARM C++與匯編混合編程: ARM 匯編如何 使用C++ 類的 公有靜態成員變數!
你的想法不錯哦!!這個我可一套論小!!
『貳』 求ARM的c語言編程實例
我給你介紹一本書,《linux應用完全開發》他的前面的內容看完你會收獲很大,很多例子。沒找到的話,我發給你(PDF書和實常式序),散個分!
『叄』 ARM處理器裸機開發實戰:機制而非策略的目錄
第1篇 基礎篇
第1章 ARM處理器簡介
1.1 處理器工作模式
1.2 寄存器介紹
1.2.1 堆棧指針寄存器R13和鏈接寄存器R14
1.2.2 程序計數器R15
1.2.3 程序狀態寄存器
1.3 工作狀態
1.4 數據長度
1.5 存儲系統
1.5.1 ARM地址空間
1.5.2 ARM存儲器的格式
1.6 天嵌TQ2440開發板硬體資源概述
1.7 本章小結
1.8 擴展閱讀之CISC處理器和RISC處理器簡介
第2章 ADS集成開發環境及程序下載具體流程
2.1 ADS 1.2集成開發環境簡介
2.1.1 CodeWarrior for ARM
2.1.2 AXD調試器的啟動
2.2 工程的編輯與修改
2.2.1 建立一個新工程
2.2.2 建立一個源文件
2.2.3 添加源文件到工程
2.2.4 編譯與鏈接工程
2.2.5 打開已有的工程
2.3 工程的調試
2.3.1 裝載映像文件
2.3.2 調試工具條的使用
2.4 H-JTAG的安裝與調試
2.4.1 H-JTAG的安裝
2.4.2 H-JTAG的設置
2.5 使用U-Boot下載裸機程序
2.6 本章小結
第3章 ARM指令集及匯編語言基礎
3.1 ARM指令集介紹
3.1.1 ARM指令集
3.1.2 ARM定址方式
3.1.3 ARM偽操作和偽指令介紹
3.2 ARM匯編基礎知識
3.3 ARM匯編程序的基本結構
3.3.1 編寫匯編程序基本的格式規范
3.3.2 程序入口和程序結束
3.3.3 段
3.3.4 標號(標志符)
3.3.5 外部標號
3.3.6 文件包含
3.4 用AXD調試ARM匯編程序實驗
3.4.1 建立工程並添加源文件
3.4.2 工程的設置
3.4.3 編譯源文件
3.4.4 啟動AXD調試器
3.4.5 手把手調試匯編程序
3.5 常用匯編語言程序子模塊實例分析
3.5.1 特殊功能寄存器的訪問
3.5.2 內存數據復制
3.5.3 批量載入與存儲
3.5.4 堆棧操作
3.5.5 實現查表功能
3.6 本章小結
3.7 擴展閱讀之內存和I/O地址、前序定址和後序定址
第4章 ARM C語言基礎
4.1 數據類型基礎
4.1.1 用typedef和#define定義類型
4.1.2 用signed和unsigned修飾數據類型
4.1.3 volatile和強制類型轉換
4.2 深入理解位運算符和位運算
4.2.1 按位與運算符(&)
4.2.2 按位或運算符(|)
4.2.3 按位取反運算符(~)
4.2.4 左移和右移運算符(<>)
4.2.5 位運算應用實例分析
4.3 控制結構
4.3.1 選擇結構
4.3.2 循環結構
4.4 防止文件重復包含技巧
4.5 ARM編譯器對C語言的擴展
4.5.1 __irq聲明中斷處理函數
4.5.2 __swi聲明軟中斷
4.5.3 __asm內嵌匯編
4.5.4 __inline定義內聯函數
4.6 本章小結
4.7 擴展閱讀之高速緩存基礎知識
第5章 ARM匯編語言和C語言混合編程基礎
5.1 一個混合編程實例的實現
5.2 APCS規則概述
5.2.1 寄存器的使用
5.2.2 參數傳遞
5.2.3 函數的返回值
5.3 本章小結
第6章 GPIO編程實驗
6.1 GPIO概述
6.1.1 GPIO引腳介紹
6.1.2 GPIO特性分析
6.1.3 GPIO相關寄存器
6.1.4 GPIO應用實例
6.2 基礎實驗:第一個裸機程序——流水燈
6.2.1 硬體電路分析
6.2.2 建立工程並添加啟動代碼
6.2.3 添加源文件
6.2.4 編輯源文件
6.2.5 工程設置、編譯、鏈接
6.2.6 下載程序到開發板運行
6.2.7 由點亮LED引發的思考
6.2.8 再議點亮LED實驗
6.2.9 將點亮一個LED擴展到流水燈
6.3 GPIO擴展實驗
6.3.1 按鍵實驗
6.3.2 蜂鳴器實驗
6.4 本章小結
6.5 擴展閱讀之模塊化編程、NAND FLASH和 NOR FLASH概述
第2篇 提高篇
第7章 啟動代碼分析
7.1 從開發板硬體講起
7.1.1 TQ2440核心板晶元功能介紹
7.1.2 從NAND FLASH和NOR FLASH啟動流程分析
7.2 啟動代碼詳解
7.3 啟動代碼主要功能模塊分析
7.3.1 建立中斷向量表
7.3.2 初始化各個模式的堆棧
7.3.3 初始化系統硬體
7.3.4 初始化應用程序的執行環境並跳轉到主程序執行
7.3.5 跳轉到C語言主程序執行
7.4 本章小結
7.5 本章附錄——完整版啟動代碼
第8章 系統時鍾和定時器
8.1 S3C2440時鍾系統概述
8.1.1 系統時鍾初始化
8.1.2 FCLK、HCLK和PCLK與Fin的關系
8.2 定時器原理與應用
8.2.1 定時器原理
8.2.2 定時器相關的寄存器
8.2.3 定時器基礎實驗代碼詳解及測試
8.2.4 定時器擴展實驗之PWM實驗
8.3 本章小結
第9章 存儲器控制器
9.1 S3C2440地址空間
9.2 操作實例:SDRAM實例分析
9.2.1 SDRAM工作原理
9.2.2 SDRAM介面電路設計
9.2.3 SDRAM初始化過程詳解
9.2.4 回顧啟動代碼中的SDRAM初始化
9.3 本章小結
第10章 通用非同步收發器(UART)
10.1 UART概述
10.2 S3C2440處理器UART工作原理
10.3 引腳描述及相關寄存器
10.4 UART基礎實驗
10.4.1 硬體電路分析
10.4.2 程序設計及代碼詳解
10.4.3 實例測試
10.4.4 UART基礎實驗分析
10.5 UART高級實驗——可變參數函數在UART中的應用
10.5.1 程序設計及代碼詳解
10.5.2 實例測試
10.6 本章小結
第11章 中斷控制系統
11.1 S3C2440中斷系統概述
11.1.1 深入理解CPU的工作模式
11.1.2 中斷控制器
11.2 外部中斷實驗
11.2.1 硬體電路分析
11.2.2 程序分析
11.2.3 中斷執行流程詳解
11.2.4 中斷處理流程引發的思考
11.2.5 實例測試
11.2.6 為什麼進入不了中斷
11.3 定時器中斷實驗
11.3.1 程序代碼分析
11.3.2 實例測試
11.4 串口中斷原理及實驗
11.4.1 如何正確使用中斷
11.4.2 程序代碼分析
11.4.3 實例測試
11.5 ARM中斷之高級應用:軟中斷原理及實驗
11.5.1 程序代碼分析
11.5.2 實例測試
11.5.3 軟中斷所用到的啟動代碼
11.6 本章小結
第12章 NAND FLASH原理與實驗
12.1 FLASH概述
12.1.1 NAND FLASH的基本結構
12.1.2 NAND FLASH介面電路
12.1.3 如何訪問NAND FLASH
12.1.4 S3C2440 NAND FLASH控制器
12.1.5 使用宏代替簡單的函數
12.2 NAND FLASH基礎實驗
12.2.1 NAND FLASH基本操作函數分析
12.2.2 NAND FLASH基礎實驗之頁讀寫
12.2.3 頁讀寫實例測試
12.2.4 NAND FLASH基礎實驗之讀ID
12.2.5 讀ID實例測試
12.3 NAND FLASH高級實驗
12.3.1 隨機讀、寫實驗代碼詳解
12.3.2 隨機讀、寫實例測試
12.4 回顧啟動代碼中的NAND FLASH讀取函數
12.5 本章小結
第13章 LCD控制器原理與實驗
13.1 LCD和LCD控制器工作原理
13.1.1 LCD概述
13.1.2 LCD介面信號
13.1.3 LCD顯示原理
13.1.4 LCD操作時序詳解
13.1.5 S3C2440 LCD控制器
13.1.6 LCD 控制寄存器初始化
13.2 LCD基礎實驗
13.2.1 硬體電路分析
13.2.2 程序代碼分析
13.2.3 實例測試
13.3 LCD基礎實驗之單像素顯示
13.3.1 程序代碼分析
13.3.2 實例測試
13.4 LCD基礎實驗之圖片顯示
13.4.1 如何將圖片轉換為C語言數組
13.4.2 程序代碼分析
13.4.3 實例測試
13.5 LCD高級實驗之漢字顯示
13.5.1 兩種常見的漢字編碼
13.5.2 LCD漢字顯示原理
13.5.3 程序代碼分析
13.5.4 實例測試
13.5.5 LCD顯示高級技巧——可變參函數Lcd_Printf的實現
13.5.6 可變參函數Lcd_Printf測試
13.5.7 漢字區位碼的思考
13.5.8 實例測試
13.6 本章小結
第14章 ADC原理與實驗
14.1 ADC原理
14.1.1 ADC相關寄存器
14.1.2 ADC初始化
14.2 ADC實驗
14.2.1 ADC實驗代碼詳解
14.2.2 ADC實驗測試
14.3 本章小結
第3篇 典型項目分析
第15章 綜合實戰
15.1 實戰1:數據採集系統實現
15.1.1 功能描述
15.1.2 模塊劃分
15.1.3 代碼實現
15.1.4 實例測試
15.1.5 實驗總結
15.2 實戰2:串口控制實驗
15.2.1 功能描述
15.2.2 模塊劃分
15.2.3 代碼實現
15.2.4 實例測試
15.2.5 實驗總結
15.3 實戰3:製作電子相冊
15.3.1 功能描述
15.3.2 模塊劃分
15.3.3 代碼實現
15.3.4 實例測試
15.3.5 實驗總結
第4篇 理論知識擴展
第16章 嵌入式系統電源設計和Linux內核開發基礎
16.1 直流穩壓電源分類
16.1.1 普通線性穩壓器工作原理
16.1.2 低壓差線性穩壓器工作原理
16.1.3 電容式開關電源的工作原理
16.1.4 電感式開關電源的工作原理
16.1.5 嵌入式系統設計中的電源晶元選型
16.1.6 設計實例分析
16.2 Linux內核基礎實驗
16.2.1 實驗一:修改調度演算法實驗
16.2.2 實驗二:添加內核模塊實驗
參考文獻
『肆』 c語言與ARM匯編混合編程的小問題
各種不同的C編譯器對於嵌入匯編的關鍵字要求都是不同的。
你可以在LOOP前加上下劃線 如 _LOOP
或者直接用地址的方式,比如$符號式指本指令地址,而 BNE $則是跳轉到本指令(死循環)。那麼轉到上一條指令(SUBS那裡)就是BNE $-1,轉到你要去的那個地方就是BNE $-6
『伍』 ARM 匯編與C程序的混合編程(怎樣實現4個以上的參數的傳遞)!
ADD proc
arg_C equ 0xC
arg_8 equ 8
arg_4 equ 4
arg_0 equ 0
MOV R12, SP
STMFD SP!, {R0-R3} ;四個參數
STMFD SP!, {R4-R10,R12,LR}
SUB SP, SP, #0x10
LDR R0, [SP,#0x34+arg_0]
LDR R1, [SP,#0x34+arg_4]
LDR R2, [SP,#0x34+arg_8]
ADD R0, R0, R1
ADD R0, R0, R2
ADD SP, SP, #0x10
LDMFD SP, {R4-R10,SP,PC}
ENDP
如果參數傳遞大於 4 個,那麼你在 BL 的地方應使用:
....
STR R0, [SP,#0x8] ;第七個
STR R0, [SP,#0x4] ;第六個
STR R0, [SP,#0x0] ;第五個
============================================
我理解你的意思了
LDR r0,=0x1
LDR r1,=0x2
LDR r2,=0x3
BL add
改為:
LDR r0,=0x1
STR R0, [SP,#0x0]
LDR r1,=0x2
STR R1, [SP,#0x4]
LDR r2,=0x3
STR R2, [SP,#0x8]
BL ADD
你是這個意思吧?
------------
int a = R0
int b = R1
int c = R2
『陸』 arm中如何實現C語言與匯編語言的混合編程
如果你是想在一個文件里混寫c語言和arm匯編,這個跟編譯器有關系,如果你用gcc,可以用__asm__語法,請自行搜索__asm__相關資料
另一種方法,就是arm匯編文件和c語言文件分開來寫,在c語言中聲明函數符號即可。然後分別編譯後再用鏈接器鏈到一起
『柒』 arm匯編怎麼調用C程序
.global _C函數名
;然後在匯編裡面
BL _C函數名
;注意調用的前.設置好堆棧就好了.
;當然..如果C函數是單獨一個文件的話,,還是需要編譯這個文件,
;並加入鏈接裡面,如果寫在其他文件裡面的.makefile裡面不需要額外的東西
範例匯編文件.調用C文件的..mycmp函數
xxxx.asm
.global _mycmp
BL _mycmp
yyyyy.c
void mycmp(void)
{}
『捌』 嵌入式ARM 混合編程,匯編調用C語言,在線等
段定義前加 PRESERVE8 偽指令試一下。
前兩天剛好看到 ARM UCOS 匯編代碼中用到PRESERVE8這個關鍵字(加在段定義之前),以前沒見過的,於是網路。
1.匯編代碼沒有保持8位元組棧對齊而調用C或C++代碼。
2.ADS下的代碼用RVDS2.2編譯時,即使已經8位元組棧對齊,連接器也將之當作非8位元組棧對齊。
所以要用偽指令指明一下。
E文不好,故而附原文以供參詳:
where assembler code (that does not preserve 8-byte stack alignment) calls compiled C/C++ code (that requires 8-byte stack alignment), and
when attempting to link legacy SDT/ADS objects with RVCT 2.x objects. Legacy SDT/ADS objects that do not have these attributes are treated as '~PRES8', even if they do actually happen to preserve 8-byte alignment.
『玖』 在MDK環境下 我編寫了一段ARM的匯編和c語言混合的程序,編譯無錯誤 無警告。
在設置裡面, 把 "run to Main()"勾去掉
『拾』 關於ARM中匯編與C程序的混合編程的參數傳遞問題!
匯編跳至C語言代碼執行,自動調用R0,R1等來傳遞參數,比如R0傳遞給a,R1傳遞給b,以此類推。返回時自動用R0傳遞返回值。希望對你有幫助