一、Thumb指令與ARM指令
Thumb指令為16位,因此存儲代碼的密度高,節省存儲空間。但是功能不全,它只是ARM指令(32位)集的補充,是ARM指令集下的一個子集。在初級階段我們不需要了解這些知識,只要有個概念知道有這么個東西就可以。
二、ARM的寄存器初步了解
R0-R3: 用于函數參數及返回值的傳遞,超過4個參數,其它參數存在棧中,在ARM中棧是向下生長的,R0還可以作為返回值。
R4-R6, R8, R10-R11: 沒有特殊規定,就是普通的通用寄存器
R7: 棧幀指針,指向母函數與被調用子函數在棧中的交界。
R9: 在iOS3.0被操作系統保留
R12: 內部過程調用寄存器,動態鏈接時會用到,不必深究
R13: SP(stack pointer),是棧頂指針
R14: LR(link register),存放函數的返回地址。
R15: PC(program counter),指向當前指令地址。
CPSR: 當前程序狀態寄存器,在用戶狀態下存放像condition標志中斷禁用等標志的。
另外還有VFP(向量浮點運算)相關的寄存器,不在列舉。
三、常用匯編
助記符 說明
ADC 帶進位的加法
ADD 加法
AND 邏輯與
B 分支跳轉,很少單獨使用
BL 分支跳轉,跳轉后返回地址存入r14
BX 分支跳轉,并切換指令模式(Thumb/ARM)
CMP 比較值,結果存在程序狀態寄存器,一般用于分支判斷
BEQ 結果為0則跳轉
BNE 結果不為0跳轉
LDR 加載寄存器,從內存加載到寄存器
LDRB 裝載字節到寄存器
LDRH 裝載半字到寄存器(一個字是32位)
LSL 邏輯左移 這是一個選項,不是指令
LSR 邏輯右移 這是一個選項,不是指令
MOV 傳送值/寄存器到一個寄存器
STR 存儲一個寄存器,寄存器值存到內存
STRB 存儲一個字節
STRH 存儲一個半字
SUB 減法
PUSH POP 堆棧操作
四、函數調用
函數的參數、局部變量、返回地址都在棧上存著,這部分棧上的內存稱為棧幀。和R0~R15(不一定全部)、CPSR等一起構成了函數的運行環境。每一個函數系統都會分配一個棧幀,執行完成后系統自動收回。每個函數都以為R0~R15、CPSR等CPU相關寄存器為自己一人享有,所以要做一些必要操作。
舉個例子:假設A調用B時,那么A要保存自己的運行環境(保存現場),B執行完后,要恢復A的運行環境(恢復現場);另外A還可以通過R0—R4來傳遞參數,參數超過4個可以通過棧,B返回時可以通過R0傳遞返回值。其中主要涉及的就是棧的操作和寄存器的操作。下圖為函數調用前后棧的布局,左邊為調用前,右邊為調用后,當B返回時應回到左邊狀態(A調用B之前的狀態,就像沒有調用B一樣)。
在上圖中,一個棧幀除了已經提到的參數區域(parameter area)、鏈接區域(linkage area)、局部變量存儲區(local storage area)外還有棧幀指針存放區域(saved frame pointer)、寄存器存儲區(saved registers area),棧幀指針上面已介紹(R7);寄存器存儲區:保存非易失寄存器(R4,R5,R6,R8,R10,R11),后面的匯編代碼例子會介紹。
開始調用(現場保護):
1)LR入棧;
2)R7入棧,包存要恢復的寄存器入棧;
3)R7 = SP地址;
4)將callee會修改且在返回caller時需要恢復的寄存器入棧;
5)分配棧空間給子程序使用。
下圖為匯編代碼(使用hopper disassemble反編譯的代碼),分析如下:
第一行:將LR, R7, R4-R6入棧;
第二行:r7=sp-0xc(指向old R7),之所以減去0xc因為PUSH后,r4,r5,r6占去12個字節;
第三行:保存要恢復的寄存器;
第四行:給當前函數開辟棧空間。
函數返回(恢復現場):
1)釋放棧空間;
2)恢復所保存的寄存器;
3)恢復R7;
4)將之前存放的LR從棧上彈出到PC,這樣函數就返回了。
下圖為匯編代碼(使用hopper disassemble反編譯的代碼),分析如下:
第一行:釋放棧空間;
第二行:恢復保存的寄存器;
第三行:恢復保存的寄存器,恢復R7,將之前存放的LR從棧上彈出到PC。
上一篇:Ubuntu安裝ARM架構GCC工具鏈最簡單辦法
下一篇:ARM Cortex M3指令集
推薦閱讀
史海拾趣
隨著全球對環保和可持續發展的關注度不斷提高,Emhiser Research也積極承擔起自己的環保責任。公司采用環保材料和生產工藝來降低產品對環境的影響;同時,公司還積極推廣綠色電子產品的理念,幫助客戶實現更加環保和可持續的生產方式。這些努力不僅提升了公司的社會責任感,也為公司的長期發展注入了新的動力。
在電子行業中,技術更新換代迅速,DECON公司深知技術創新的重要性。因此,公司不斷投入研發資金,引進高端技術人才,加強自主創新,推出了多款具有領先技術的連接器產品。這些產品不僅滿足了市場需求,還提高了公司的市場競爭力。同時,公司還積極與國內外知名企業合作,共同研發新產品,推動了電子連接器行業的發展。
AdTech公司一直注重創新,不斷投入研發資源以推出新產品和解決方案。公司通過優化芯片結構設計、提升器件封裝技術等手段,不斷提升QCL的性能和穩定性。此外,公司還積極探索QCL在新能源、環保等領域的應用潛力,開發出了一系列具有創新性和實用性的產品。這些創新成果不僅提升了公司的核心競爭力,也為行業的發展注入了新的活力。
DURATOOL公司自成立以來,一直致力于電子工具的技術創新。在20世紀90年代,公司研發出了一款具有革命性的數字萬用表,該產品在精確度、穩定性和操作便捷性方面均大幅超越當時的市場主流產品。這一創新不僅為DURATOOL公司贏得了大量忠實用戶,也為其在電子測量工具市場樹立了技術領先的形象。隨后,DURATOOL公司不斷加大研發投入,推出了一系列具有競爭力的新產品,逐步鞏固了其在電子工具行業的領先地位。
1994年,AMOTECH在韓國創立,憑借創始人的遠見卓識和技術團隊的扎實能力,公司迅速在電子行業中嶄露頭角。經過兩年的努力,1996年,AMOTECH被政府通訊部評為“光明前途企業”,這是對其技術實力和市場潛力的肯定。隨后,公司不斷加大研發投入,終于在2000年獲得ISO9000認證,這標志著AMOTECH在產品質量管理上達到了國際標準。
CSM成立以來,一直致力于研發具有自主知識產權的射頻/模擬關鍵芯片。經過數年的辛勤耕耘,團隊成功開發出了多款高性能的集成電路芯片與模塊,其中不乏在功耗、成本、性能等方面達到國際先進水平的產品。這些技術突破不僅為公司贏得了市場的認可,也為國內電子行業的發展注入了新的活力。
(八)//以上的文字寫于2005年5月,由于時間關系,一直未能將此完成,最近閑著無聊又接著寫了些文字,以下寫于2006年6月5日! 在這里我想對上面一點,作個簡單的說明,如果你是剛學單片機,那么你寫的代碼是VERY GOOD的,但是如果把上面 ...… 查看全部問答∨ |
|
用UTU2440開發板接收電腦串口發送數據,正常 用用電腦接收工作板發送過來的數據,正常 但是用UTU2440接收工作板發送過來的數據不正常,并且與波特率有一定的關系 正常數據為$L-0360,+000,00000,R-0633,+000,00000# 在波特率為4800是用UTU24 ...… 查看全部問答∨ |
1、求i,j,k,ret int i=-2; int j=1; int k=2; int ret=++i&&++j||++k; 2、 請指出變量a,b,c在內存中存儲位置(數據段,棧,代碼段)及a,b,c的值 int a; void fun() { ...… 查看全部問答∨ |
請教各位高手,我在PB for CE 6.0生成SDK后.SDK的大小要么只有6M左右..要么就是在VS2005里面不能調出或者調出后Emulator的窗口很小.請問一下應該怎么設置或者告訴我是什么問題.謝謝… 查看全部問答∨ |
|
我的系統是XP,現在要在PCI插槽上加一塊計數器,然后利用MFC編寫的程序來獲取計數器輸出的脈沖電平,該電平的脈沖寬度是1ms。 想問的是從底層計數器讀取外部信號電平到輸出電平到經過PCI總線到我的MFC程序獲取這個電平的上升沿,這個過程一般要多長 ...… 查看全部問答∨ |
遇到一奇怪的現象, 在程序的某個地方經常增加一條指令即使是nop();會出現程序的其他地方出現延時變長的現象,如下,即使我在前后增加了關中斷,延時變長差不多18%左右,現無法找到問題的根源, 出現這種情況,只要在增加程序的方再增加一個nop()或延 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析