標(biāo)題: ARM嵌入式匯編語(yǔ)言程序設(shè)計(jì)重點(diǎn) [打印本頁(yè)]

作者: qq8426030    時(shí)間: 2014-7-14 15:26
標(biāo)題: ARM嵌入式匯編語(yǔ)言程序設(shè)計(jì)重點(diǎn)

ARM嵌入式匯編語(yǔ)言程序設(shè)計(jì)重點(diǎn)
實(shí)驗(yàn)?zāi)康?font face="Times New Roman">
l 熟悉ARM微處理器指令系統(tǒng);
l
學(xué)習(xí)ARM嵌入式匯編程序設(shè)計(jì)的編程重點(diǎn)。
實(shí)驗(yàn)設(shè)備
l 硬件:PC機(jī)。
l
軟件:ADS1.2集成開(kāi)發(fā)環(huán)境,Windows 2000/XP/2003
實(shí)驗(yàn)內(nèi)容
l 了解多分支程序的編寫(xiě)方法; l
掌握ARM程序的運(yùn)行和調(diào)試。
實(shí)驗(yàn)原理
1Arm 體系結(jié)構(gòu)3種執(zhí)行流程 1 順序執(zhí)行:在正常執(zhí)行過(guò)程中,每執(zhí)行一條ARM指令,程序計(jì)數(shù)器(PC)的值加4個(gè)字節(jié);每執(zhí)行一條Thumb指令,程序計(jì)數(shù)器 (PC)2個(gè)字節(jié)。整個(gè)過(guò)程按順序執(zhí)行。 2 跳轉(zhuǎn)執(zhí)行:程序可以跳轉(zhuǎn)到特定的地址標(biāo)號(hào)處執(zhí)行,或者跳轉(zhuǎn)到特定的子程序處執(zhí)行。 3 異常中斷執(zhí)行:在進(jìn)入異常中斷處理程序時(shí),要保存被中斷程序的執(zhí)行現(xiàn)場(chǎng),從異常中斷
處理程序退出時(shí),要恢復(fù)被中斷程序的執(zhí)行現(xiàn)場(chǎng)。  
2)跳轉(zhuǎn)表
多分支結(jié)構(gòu)是程序中常見(jiàn)的結(jié)構(gòu),若給出調(diào)用號(hào)來(lái)調(diào)用子程序,一般用查表方法,查到子程序的地址,轉(zhuǎn)到相應(yīng)子程序。注意:讀跳轉(zhuǎn)表時(shí)不要超過(guò)表的末端,檢查超限是必需的。例如:
BL  JUMPTABLE
JUMPTABLE ADR R1,SUBTABLE
            CMP R0,#SUBMAX   ;檢查超限
            BHI stop             ;若超限,則程序結(jié)束             LDR PC,[R1,R0,LSL #2];否則跳轉(zhuǎn)到表中 stop  MOV R0,#0X18  
LDR R1,=0X20026
SWI 0x123456
SUBTABLE DCD SUB0            ;子程序表入口            DCD SUB1            DCD SUB2
實(shí)驗(yàn)參考程序
利用跳轉(zhuǎn)表實(shí)現(xiàn)多分支轉(zhuǎn)移。
AREA JUMP,CODE,READONLY;設(shè)置本段程序的名稱(chēng)(JUMP)及屬性
num EQU 2         ;跳轉(zhuǎn)表中的子程序個(gè)數(shù)       ENTRY      ;程序執(zhí)行的入口點(diǎn)
START  ;設(shè)置3個(gè)參數(shù),然后調(diào)用子程序arithfunc,進(jìn)行算術(shù)運(yùn)算       MOV R0,#0
      MOV R1,#3       MOV R2,#2
      BL arithfunc  ;調(diào)用子程序arithfunc
STOP  ;調(diào)用angel_SWIreason_ReportException,從應(yīng)用程序中退出       MOV R0,#0X18
      LDR R1,=0X20026       SWI 0x123456
arithfunc        ;子程序arithfunc入口點(diǎn)
      CMP R0,#num;判斷選擇子程序的參數(shù)是否在有效范圍之內(nèi)       MOVHS PC,LR
      ADR R3,JumpTable;讀取跳轉(zhuǎn)表的基地址
      LDR PC,[R3,R0,LSL #2];根據(jù)參數(shù)R0的值跳轉(zhuǎn)到相應(yīng)的子程序
;跳轉(zhuǎn)表JumpTable中保存了各個(gè)子程序的地址, 在這里有兩個(gè)子程序DoAddDoSub ;當(dāng)參數(shù)R00時(shí)上面的代碼將選擇DoAdd ;當(dāng)參數(shù)R01時(shí)上面的代碼將選擇DoSub JumpTable
      DCD DoAdd       DCD DoSub
DoAdd 子程序DoAdd執(zhí)行加法操作       ADD R0,R1,R2
      MOV PC,LR
DoSub 子程序DoSub執(zhí)行減法操作       SUB R0,R1,R2       MOV PC,LR       END;結(jié)束匯編
實(shí)驗(yàn)思考題
1. 修改下列C程序段代碼為ARM匯編程序段代碼。
   do {  x--; } while(x>0);   這里設(shè)x存放在R0 (x為無(wú)符號(hào)整數(shù)) DOWHILE_L1  ADD  R0,R0,#-1      ; 循環(huán)體,x--
DOWHILE_L2  MOVS R0,R0         ; R0 <= R0,并影響條件碼標(biāo)志   
BNE  DOWHILE_L1   ; R0不為0(x不為0),則繼續(xù)循環(huán)
DOWHILE_END  NOP   
2. 編寫(xiě)一簡(jiǎn)單ARM匯編程序段,實(shí)現(xiàn)1+2++100的運(yùn)算。   AREA EXAMPLE1, CODE,READONLY  ;定義一個(gè)代碼段,名稱(chēng)為EXAMPLE1   ENTRY                             ;入口
  MOV     R0,#0                     ;R0賦值為0
  
MOV   R1,#0                       ;R1來(lái)存放1~100的總和,初始化為0
START  ADD  R0,R0,#1               ;用來(lái)判斷終止的,每次加1        ADD  R1,R1,R0                ;1加到100      
       CMP  R0,#100             ;執(zhí)行R0-100的操作,但不保存,只影響CPSR的值        BLT  START              ;帶符號(hào)數(shù)小于時(shí)跳轉(zhuǎn)到START處執(zhí)行 STOP   B     STOP              ;死循環(huán)        END
全面承快速樣板及小批量貼片,后焊加工業(yè)務(wù),樣板2-3天完成,加快24小時(shí), BGA反修,植球及更換。電話:0755-2655271 QQ: 2643383166,網(wǎng)站
同樣的業(yè)務(wù)我們比質(zhì)量;同樣的質(zhì)量我們比價(jià)格;同樣的價(jià)格我們比時(shí)間,同樣的時(shí)間我們比服務(wù);同樣的服務(wù)我們比信譽(yù),麥斯艾姆,你值得信賴(lài)的樣板貼片專(zhuān)家。






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1