版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
任課教師:栗華課號:0123305810-100嵌入式系統(tǒng)原理及應用教程第四章嵌入式系統(tǒng)程序設(shè)計本章包含嵌入式系統(tǒng)開發(fā)平臺介紹,嵌入式匯編程序設(shè)計,嵌入式C語言程序設(shè)計及混合編程。本章內(nèi)容4.1嵌入式系統(tǒng)開發(fā)流程4.2ARM開發(fā)軟件及實用工具介紹4.3ARM匯編語言程序設(shè)計根底4.4ARMC語言程序設(shè)計及混合編程1、嵌入式系統(tǒng)開發(fā)根本流程嵌入式開發(fā)的具體過程:系統(tǒng)定義與需求分析階段方案設(shè)計階段詳細設(shè)計階段軟硬件集成測試階段系統(tǒng)功能性能測試及可靠性測試階段4.1嵌入式系統(tǒng)開發(fā)流程開發(fā)流程圖2.嵌入式軟件開發(fā)環(huán)境嵌入式開發(fā)環(huán)境組成交叉開發(fā)環(huán)境軟件模擬環(huán)境目標板與評估板
交叉開發(fā)環(huán)境嵌入式系統(tǒng)應用軟件的開發(fā)屬于跨平臺開發(fā),因此需要一個交叉開發(fā)環(huán)境。交叉開發(fā)是指在一臺通用計算機上進行軟件的編輯編譯,然后下載到嵌入式設(shè)備中運行調(diào)試的開發(fā)方式,它通常采用宿主機/目標機模式。用來開發(fā)的通用計算機可以選用比較常見的PC機等,運行通用的Windows等操作系統(tǒng)。開發(fā)計算機一般稱宿主機,嵌入式設(shè)備稱為目標機,在宿主機上編譯好的程序,下載到目標機上運行,交叉開發(fā)環(huán)境提供調(diào)試工具對目標機上運行的程序進行調(diào)試。交叉開發(fā)環(huán)境交叉開發(fā)環(huán)境一般由運行于宿主機上的交叉開發(fā)軟件、宿主機到目標機的調(diào)試通道組成。運行于宿主機上的交叉開發(fā)軟件最少必須包含編譯調(diào)試模塊,其編譯器為交叉編譯器。作為宿主機的一般為基于x86體系的桌上型計算機,而編譯出的代碼必須在目標機處理器體系結(jié)構(gòu)上運行,這就是所謂的交叉編譯了。在宿主機上編譯好目標代碼后,通過宿主機到目標機的調(diào)試通道將代碼下載到目標機,然后由運行于宿主機的調(diào)試軟件控制代碼在目標機上運行調(diào)試。遠程調(diào)試結(jié)構(gòu)圖3.嵌入式應用軟件開發(fā)的根本流程
嵌入式軟件開發(fā)流程圖鏈接器命令文件編譯預處理編譯器匯編器Archive工具鏈接器和定位器頭文件(*.h,*.hpp)可重定位目標文件庫文件(*.a,*.lib)頭文件(*.h,*.hpp)C/C++源代碼匯編源代碼源文件列表源文件列表源代碼編輯階段
源文件編
譯階段鏈接與重定位調(diào)試與下載階段重定位文件表(*.o,*.a)共享目標文件(*.o,*.a)可執(zhí)行映象(*.elf,*.coff)鏈接映射文件(*.map)設(shè)備程序員目標開發(fā)系統(tǒng)軟件模擬環(huán)境也稱為指令集模擬器IIS〔InstructionSetSimulator〕,在很多時候為保證工程進度,硬件和軟件開發(fā)往往同時進行,這時作為目標機的硬件環(huán)境還沒有建立起來,軟件的開發(fā)就需要一個模擬環(huán)境來進行調(diào)試。模擬開發(fā)環(huán)境建立在交叉開發(fā)環(huán)境根底之上,是對交叉開發(fā)環(huán)境的補充。這時,除了宿主機和目標機之外,還需要提供一個在宿主機上模擬目標機的環(huán)境,使得開發(fā)好的程序直接在這個環(huán)境里運行調(diào)試。軟件模擬環(huán)境應用目標板是系統(tǒng)最終的電路板。評估板(EVM板〕一般用來作為開發(fā)者使用的學習板、實驗板,可以作為應用目標板出來之前的軟件測試、硬件調(diào)試的電路板。開發(fā)評估電路板并不是嵌入式應用開發(fā)必須的,對于有經(jīng)驗的工程師完全可以自行獨立設(shè)計自己的應用電路板和根據(jù)開發(fā)需要設(shè)計實驗板。好的評估電路板一般文檔齊全,對處理器的常用功能模塊和主流應用都有硬件實現(xiàn),并提供電路原理圖和相關(guān)開發(fā)例程與源代碼供用戶設(shè)計自己的應用目標板和應用程序作參考。目標板與評估板在嵌入式軟件的開發(fā)過程中,在確保軟件的正確性、實時性的前提下,必須關(guān)注軟件的可移植性和可重用性。??梢浦残院涂芍赜眯缘某潭葢摳鶕?jù)實際的應用情況來考慮。因為嵌入式應用軟件有自身的許多特點。追求過高的可移植性和可重用性可能會惡化應用軟件的實時性能和增加軟件的代碼量,這對于資源有限的嵌入式應用環(huán)境是得不償失的。我們可以在資源有限、滿足系統(tǒng)的需求的情況下盡可能把可移植性和可重用性作為第二目標,致力于開發(fā)正確性、實時性能、代碼量、可移植性和可重用性相對均衡的嵌入式應用軟件。4.嵌入式軟件開發(fā)的可移植性和可重用性
4.嵌入式軟件開發(fā)的可移植性和可重用性提高應用軟件的可移植性和可重用性的方法:多用高級語言少用匯編語言將不可移植局部局域化提高代碼的可重用性提高代碼的可重用性一、編譯器介紹1、ADS1.2
2、ARM
REALVIEW
DEVELOPER
SUITE3、IAR
EWARM4、KEIL
ARM-MDKARM5、WINARM
(GCCARM)二、相關(guān)開發(fā)工具介紹1、簡易的JTAG制作2、H-JTAG調(diào)試代理3、LPC2000系列ISP工具4、Macraigor
Systems
Wiggler
調(diào)試工具5、J-LINK6、U-LINK
4.21、ADS1.2
ADS〔ARMDeveloperSuite〕,是在1993年由Metrowerks公司開發(fā)是ARM處理器下最主要的開發(fā)工具。他的前身是SDT,SDT是ARM公司幾年前的開發(fā)環(huán)境軟件,目前SDT早已經(jīng)不再升級。ADS包括了四個模塊分別是:SIMULATOR;C
編譯器;實時調(diào)試器;應用函數(shù)庫。ADS對匯編、C/C++、java支持的均很好,是目前最成熟的ARM開發(fā)工具。很多ARM開發(fā)軟件〔例如Keil〕也是借用的ADS的編譯器。ADS在2006年版本已經(jīng)發(fā)布到2.2。但國內(nèi)大局部開發(fā)者使用的均是1.2版本一、編譯器介紹ADS1.2提供完整的WINDOWS界面開發(fā)環(huán)境。C編譯器效率高,支持c
以及c++。提供軟件模擬仿真功能,使沒有Emulators的學習者也能夠熟悉ARM的指令系統(tǒng)。配合FFT-ICE使用,ADS1.2提供強大的實時調(diào)試跟蹤功能,片內(nèi)運行情況盡在掌握。ADS1.2需要硬件支持才能發(fā)揮強大功能。目前支持的硬件調(diào)試器有Multi-ICE以及兼容Multi-ICE的調(diào)試工具如FFT-ICE。版本:ADS1.2
軟件大?。?30M
下載地址:ARMRealViewDeveloperSuite(RVDS)是ARM公司繼ARMDeveloperSuite(ADS1.2)之后推出的新一代開發(fā)工具,是業(yè)界公認最好的ARM編譯器之一。它由RealView編譯器(RVCT),以及RealView調(diào)試器〔RVDebugger〕,CodeWarrior集成開發(fā)環(huán)境和ARMulator指令集仿真器組成??梢灾С炙袠藴蔄RM架構(gòu)和內(nèi)核,針對特定處理器進行代碼優(yōu)化,有多種可以靈活配置的優(yōu)化選項以取得最小的代碼尺寸和最好的性能。2、ARMRealViewDeveloperSuite(RVDS)
RealViewICE主要特點:高性能的調(diào)試控制通過RealViewDebugger代碼下載速度可達1300Kbytes/秒高速單步執(zhí)行,每秒可達100支持JTAG調(diào)試通信通道(DCC)支持多種JTAG時鐘頻率,從2KH~50MHZ更低的JTAG時鐘頻率(低于1KHZ),支持ASIC外圍電路調(diào)試寬電壓支持1.0~5.0V支持多核處理器調(diào)試,同步控制
配合RealViewTrace模塊插件可捕獲支持ETM跟蹤數(shù)據(jù)
通過JTAG訪問ETB跟蹤數(shù)據(jù)
兼容GDB與KGDB調(diào)試支持USB1.1與2.0連接
支持網(wǎng)絡連接調(diào)試10/100baseT
支持的ARM處理器:ARM7TM,ARM9TM,ARM9ETM,ARM10TM,ARM11TM和CortexTM
RealViewTrace主要特性:
非插入式的實時指令跟蹤與數(shù)據(jù)跟蹤,跟蹤頻率可高達250MHZ,高達8百萬幀深度的跟蹤緩沖區(qū)〔高達4百萬幀深度的timestamp緩沖區(qū)〕48位timestamp,10納秒分辨率,支持最長連續(xù)32天數(shù)據(jù)跟蹤4/8/16位數(shù)據(jù)寬度跟蹤端口外部事件同步觸發(fā)器完全可變的觸發(fā)位置快速on-the-fly跟蹤數(shù)據(jù)上傳與主機共享RealViewICE連接支持ETM跟蹤端口模式支持v1.x,v2.x,v3.xforETM7TMETM9TM,ETM10TM與ETM11TM等ETM協(xié)議單邊沿和雙邊沿時鐘觸發(fā)普通與多元的端口
庫創(chuàng)立工具內(nèi)容豐富的在線文檔版本:ARMRealViewDeveloper2.2軟件大?。?00M下載地址:://mcu123/down/view.asp?id=52
Embedded
Workbench
for
ARM
是IAR
Systems
公司為ARM
微處理器開發(fā)的一個集成開發(fā)環(huán)境(下面簡稱IAR
EWARM)。比較其他的ARM
開發(fā)環(huán)境,IAR
EWARM
具有入門容易、使用方便和代碼緊湊等特點。EWARM
中包含一個全軟件的模擬程序(simulator)。用戶不需要任何硬件支持就可以模擬各種ARM
內(nèi)核、外部設(shè)備甚至中斷的軟件運行環(huán)境。從中可以了解和評估IAR
EWARM
的功能和使用方法。最新版本是:IAR
Embedded
Workbench
for
ARM
version
4.30。
3、IAREWARMIAR
EWARM
的主要特點如下:1、高度優(yōu)化的IAR
ARM
C/C++
Compiler
2、IAR
ARM
Assembler3、一個通用的IAR
XLINK
Linker4、IAR
XAR
和XLIB
建庫程序和IAR
DLIB
C/C++運行庫5、功能強大的編輯器6、工程管理器7、命令行實用程序8、IAR
C-SPY
調(diào)試器(先進的高級語言調(diào)試器)版本:IAR
EWARM
4.40a
軟件大?。?3M
下載地址:Keil公司已從事MCS-51開發(fā)平臺uVision著名。近年來,Keil公司也將自己的領(lǐng)域擴展到了ARM的開發(fā)工具,即:keilarm,再后來keil真的被arm收購了,他的arm開發(fā)工具這一塊就是現(xiàn)在的MDK系列。
Keil
uVision調(diào)試器可以幫助用戶準確地調(diào)試ARM器件的片內(nèi)外圍功能(I2C、CAN、UART、SPI、中斷、I/O口、A/D轉(zhuǎn)換器、D/A轉(zhuǎn)換器和PWM模塊等功能)。KeilMDK-ARM最新版本4.54,安裝包500多兆,包括ARM的編譯器和uVision4集成開發(fā)環(huán)境。
4、KEILARM-MDKARMMDK-ARM具有四種版本:MDK-Lite、MDK根底版、MDK標準版和MDK專業(yè)版。所有版本都提供完整的C/C++開發(fā)環(huán)境,MDK專業(yè)版包括豐富的中間件庫。Project/Target/Group/File的重疊管理模式,并可逐級設(shè)置;高度智能彩色語法顯示;
4、KEILARM-MDKARM特點完全支持ARMCortex?-M系列、Cortex-R4、ARM7?和ARM9?設(shè)備行業(yè)領(lǐng)先的ARMC/C++編譯工具鏈μVision4IDE、調(diào)試器和模擬環(huán)境支持來自20多個供給商的1200多種設(shè)備特點KeilRTX確定性、占用空間小的實時操作系統(tǒng)〔具有源代碼〕TCP/IP網(wǎng)絡套件提供多個協(xié)議和各種應用程序USB設(shè)備和USB主機堆棧配備標準驅(qū)動程序類ULINKpro支持對正在運行的應用程序進行即時分析并記錄執(zhí)行的每條Cortex-M指令有關(guān)程序執(zhí)行的完整代碼覆蓋率信息執(zhí)行性能分析器和性能分析器支持程序優(yōu)化大量例如工程可幫您快速熟悉強大的內(nèi)置功能符合CMSISCortex微控制器軟件接口標準多種流行編譯工具選擇
Keil高效率C編譯器;ARM公司的ADS/RealView
編譯器;GNU
GCC
編譯器;后續(xù)廠商的編譯器。官方keil
WINARM
是一個免費的開發(fā)工具。
WinARM
可以在://siwawi.arubi.uni-kl.de/avr_projects/arm_projects/
下載得到,里面除了包含
C/C++
編譯器——GCC,匯編、連接器——Binutils,調(diào)試器——GDB等工具,也包括了通過
GDB
使用
Wiggler
JTAG
的軟件——OCDRemote。所以,所需要的工具都包括在了這個
WinARM
發(fā)行版中,就可以比較省心了。
官方發(fā)布://siwawi.arubi.uni-kl.de/avr_projects/arm_projects/
軟件大?。?0M
下載地址:WinARM
20060606
zip-Archive
here
://siwawi.arubi.uni-kl.de/avr_projects/arm_projects/WinARM-20060606.zip
WINARM簡易使用說明:5、WINARM-GCCARM1、JTAG仿真器
JTAG(JointTestActionGroup;聯(lián)合測試行動小組)是一種國際標準測試協(xié)議〔IEEE1149.1兼容〕,主要用于芯片內(nèi)部測試及對系統(tǒng)進行仿真、調(diào)試。JTAG技術(shù)是一種嵌入式調(diào)試技術(shù),它在芯片內(nèi)部封裝了專門的測試電路TAP〔TestAccessPort,測試訪問口〕,通過專用的JTAG測試工具對內(nèi)部節(jié)點進行測試。JTAG接口還常用于實現(xiàn)ISP〔In-SystemProgrammer,在系統(tǒng)編程〕,對FLASH等器件進行編程。二、相關(guān)開發(fā)工具1、JTAG仿真器
通常所說的JTAG大致分兩類,一類用于測試芯片的電氣特性,檢測芯片是否有問題;一類用于Debug,一般支持JTAG的CPU內(nèi)都包含了這兩個模塊。一個含有JTAGDebug接口模塊的CPU,只要時鐘正常,就可以通過JTAG接口訪問CPU的內(nèi)部存放器和掛在CPU總線上的設(shè)備,如FLASH,RAM,SOC〔比方4510B,44Box,AT91M系列〕內(nèi)置模塊的存放器,象UART,Timers,GPIO等等的存放器?,F(xiàn)在多數(shù)的高級器件都支持JTAG協(xié)議,如:新型單片機如MSP430、ARM、DSP、FPGA器件等。標準的JTAG接口是4線:TMS、TCK、TDI、TDO,分別為模式選擇、時鐘、數(shù)據(jù)輸入和數(shù)據(jù)輸出線。二、相關(guān)開發(fā)工具標準的JTAG接口是4線:TMS、TCK、TDI、TDO,分別為測試模式選擇、測試時鐘、測試數(shù)據(jù)輸入和測試數(shù)據(jù)輸出。如今JTAG接口的連接有兩種標準,即14針接口和20針接口,其定義分別如下所示。14針的JTAG接口為老式接口。引腳信號說明SAMSUNGARM7S3C44B0開發(fā)套件中的JTAG編程板電路如圖PC并口引腳:2
3
4
8JTAG引腳:TCK
TMSnSRSTTDI引腳對應關(guān)系:S3C2440的官方JTAG編程板PC并口引腳:2
3
4
11JTAG引腳:TCK
TDI
TMS
TDO引腳對應關(guān)系:J-Link是SEGGER公司為支持仿真ARM內(nèi)核芯片推出的采用USB接口的JTAG仿真器。配合IAREWAR,ADS,KEIL,WINARM,RealView等集成開發(fā)環(huán)境支持所有ARM7/ARM9/ARM11,CortexM0/M1/M3/M4,CortexA4/A8/A9等內(nèi)核芯片的仿真,與IAR,Keil等編譯環(huán)境無縫連接,操作方便、連接方便、簡單易學,是學習開發(fā)ARM最好最實用的開發(fā)工具。
2、
J-LINK仿真調(diào)試器J-LinkARM主要特點:IAREWARM集成開發(fā)環(huán)境無縫連接的JTAG仿真器。支持CPUs:AnyARM7/9/11,Cortex-A5/A8/A9,Cortex-M0/M1/M3/M4,Cortex-R4,RX610,RX621,RX62N,RX62T,RX630,RX631,RX63N。下載速度高達1MByte/s。最高JTAG速度15MHz。目標板電壓范圍1.2V–3.3V,5V兼容。自動速度識別功能。監(jiān)測所有JTAG信號和目標板電壓。完全即插即用。使用USB電源〔但不對目標板供電〕帶USB連接線和20芯扁平電纜。支持多JTAG器件串行連接。標準20芯JTAG仿真插頭。選配14芯JTAG仿真插頭。選配用于5V目標板的適配器。帶J-LinkTCP/IPserver,允許通過TCP/IP網(wǎng)絡使用J-Link。KeilULINKUSB接口仿真器,是一款多功能ARM調(diào)試工具,可以通過JTAG或CODS接口連接到目標系統(tǒng),進行仿真或下載程序,目前已經(jīng)成為國內(nèi)主流的ARM開發(fā)工具。KeilULINK的軟件環(huán)境為KeiluVisionKeil系列軟件具有良好的調(diào)試界面,優(yōu)秀的編譯效果,豐富的使用資料。使其深受國內(nèi)嵌入式開發(fā)工程師的喜愛。目前,ULINK已經(jīng)停產(chǎn),新用戶推薦選擇ULINK2或ULINKPro仿真器。3、
U-LINK仿真調(diào)試器ULINK2是ARM公司最新推出的配套RealViewMDK使用的仿真器,是ULink仿真器的升級版本。ULINK2不僅具有ULINK仿真器的所有功能,還增加了串行調(diào)試〔SWD〕支持,返回時鐘支持和實時代理等功能。開發(fā)工程師通過結(jié)合使用RealViewMDK的調(diào)試器和ULINK2,可以方便的在目標硬件上進行片上調(diào)試(使用on-chipJTAG,SWD和OCDS)、Flash編程.3、
U-LINK仿真調(diào)試器支持ARM7,ARM9,Cortex-M,8051和C166設(shè)備JTAG速度高達10MHz支持Cortex-M串行查看器〔SWV〕數(shù)據(jù)和時間跟蹤,速度高達1Mbit/s〔UART模式〕執(zhí)行、端口仿真和串行調(diào)試輸出時的存儲器讀寫實時代理與KeilμVisionIDE和Debugger無縫隙集成寬目標電壓,從2.7V–5.5V可用USB供電〔無須電源〕使用標準WindowsUSB設(shè)備,即插即用安裝目標連接器ULINK2特點:ULINK是KEIL公司開發(fā)的仿真器,專用于KEIL平臺下使用,ADS,IAR下不能使用JLINK是通用的開發(fā)工具,可以用于KEIL,IAR,ADS等平臺速度,效率,功能均比ULINK強ULINK2的下載速度和調(diào)試速度確實沒有JLINK的快。ULINK和JLINK的比較4.3ARM匯編語言程序設(shè)計根底ARM匯編語言的偽操作、宏指令與偽指令ARM7匯編語言程序設(shè)計步驟ARM7匯編語言程序設(shè)計4.3.1ARM匯編語言的偽操作、宏指令與偽指令ARM匯編語言源程序中語句一般由指令、偽操作、宏指令和偽指令組成偽操作是ARM匯編語言程序里的一些特殊指令助記符,它的作用主要是為完成匯編程序做各種準備工作,在源程序進行匯編時由匯編程序處理,而不是在計算機運行期間由機器執(zhí)行。3.3.1ARM匯編語言的偽操作、宏指令與偽指令宏指令是一段獨立的程序代碼,可以插在源程序中,它通過偽操作來定義。宏在被使用之前必須提前定義好,宏之間可以互相調(diào)用,也可以自己遞歸調(diào)用。通過直接書寫宏名來使用宏,并根據(jù)宏指令的格式設(shè)置相應的輸入?yún)?shù)。宏定義本身不會產(chǎn)生代碼,只是在調(diào)用它時把宏體插入到源程序中。偽指令也是ARM匯編語言程序里的特殊指令助記符,也不在處理器運行期間由機器執(zhí)行,它們在匯編時將被適宜的機器指令代替成ARM或Thumb指令,從而實現(xiàn)真正指令操作。兩種編譯模式的集成開發(fā)環(huán)境IDE介紹ADS/SDTIDE開發(fā)環(huán)境它由ARM公司開發(fā),使用了CodeWarrior公司的編譯器;集成了GNU開發(fā)工具的IDE開發(fā)環(huán)境它由GNU的匯編器as、交叉編譯器gcc、和鏈接器ld等組成。ADS編譯環(huán)境下的ARM偽操作和宏指令ADS編譯環(huán)境下的偽操作有如下幾種:符號定義〔SymbolDefinition〕偽操作數(shù)據(jù)定義〔DataDefinition〕偽操作匯編控制〔AssemblyControl〕偽操作框架描述〔FrameDescription〕偽操作信息報告〔Reporting〕偽操作其他〔Miscellaneous〕偽操作4.3.1.1符號定義偽操作1.全局變量定義偽指令GBLA、GBLL、GBLS2.局部變量定義偽指令LCLA、LCLL、LCLS3.變量賦值偽指令SETA、SETL、SETS4.存放器列表定義偽指令RLIST1.GBLA,GBLL及GBLSGBLA,GBLL及GBLS偽操作用于聲明一個ARM程序中的全局變量并在默認情況下將其初始化。GBLA偽操作聲明一個全局的算術(shù)變量,并將其初始化成0GBLL偽操作聲明一個全局的邏輯變量,并將其初始化成{FALSE}GBLS偽操作聲明一個全局的字符串變量,并將其初始化成空串“〞語法格式<GBLX>Variable其中:<GBLX>是GBLA,GBLL或GBLS3種偽操作之一;Variable是全局變量的名稱。在其作用范圍內(nèi)必須惟一,即同一個變量名只能在作用范圍內(nèi)出現(xiàn)一次。使用例如GBLAA1;定義一個全局的數(shù)值變量,變量名為A1A1SETA0x0F;將該變量賦值為0x0F
GBLLA2;定義一個全局的邏輯變量,變量名為A2A2SETL{TRUE};將該變量賦值為真
GBLSA3;定義一個全局的字符串變量,變量名為A3A3SETS“Testing〞;將該變量賦值為“Testing〞2.LCLA,LCLL及LCLSLCLA,LCLL及LCLS偽操作用于聲明一個ARM程序中的局部變量,并在默認情況下將其初始化。LCLA偽操作聲明一個局部的算術(shù)變量,并將其初始化成0。LCLL偽操作聲明一個局部的邏輯變量,并將其初始化成{FALSE}LCLS偽操作聲明一個局部的串變量,并將其初始化成空串“〞語法格式<LCLX>Variable其中:<LCLX>是LCLA,LCLL或LCLS3種偽操作之一;Variable是局部變量的名稱。在其作用范圍內(nèi)必須唯一,即同一個變量名只能在作用范圍內(nèi)出現(xiàn)一次。使用例如:LCLATest4;聲明一個局部的數(shù)值變量,變量名為Test4Test4SETA0xaa;將該變量賦值為0xaa
LCLLTest5;聲明一個局部的邏輯變量,變量名為Test5Test5SETL{TRUE};將該變量賦值為真LCLSTest6;定義一個局部的字符串變量,變量名為Test6Test6SETS“Testing〞;將該變量賦值為“Testing〞3.SETA,SETL及SETSSETA,SETL及SETS偽操作用于給一個ARM程序中的全局或局部變量賦值。SETA偽操作給一個全局或局部算術(shù)變量賦值SETL偽操作給一個全局或局部邏輯變量賦值SETS偽操作給一個全局或局部字符串變量賦值語法格式<SETX>Variableexpr
其中:<SETX>是SETA,SETL或SETS3種偽操作之一;Variable是使用GBLA,GBLL,GBLS,LCLA,LCLL或LCLS定義的變量的名稱,在其作用范圍內(nèi)必須唯一;expr為表達式,即賦予變量的值。4存放器列表定義偽指令RLIST格式:名稱 RLIST{通用存放器列表}功能:用于對一個通用存放器列表定義名稱,reglistRLIST{R0-R3,R8,R12} … STMFD SP!,reglist ;將列表reglist存儲到堆棧中 … LDMIA R4,reglist ;將列表reglist加載到R4中4.3.1.2數(shù)據(jù)定義偽操作1.定義字節(jié)存儲單元偽操作DCB2.定義半字存儲單元偽操作DCW〔DCWU〕3.定義字存儲單元偽操作DCD〔DCDU〕4.為單精度浮點數(shù)定義字存儲單元偽操作DCFS〔DCFSU〕5.為雙精度浮點數(shù)定義字存儲單元偽操作DCFD〔DCFDU〕6.內(nèi)存單元分配偽操作SPACE7.定義結(jié)構(gòu)化內(nèi)存表首地址偽操作MAP8.定義結(jié)構(gòu)化內(nèi)存表中數(shù)據(jù)域偽操作FIELD9.定義文字池偽操作LTORG1.DCB格式:標號DCB表達式功能:DCB偽操作用于分配一片連續(xù)的字節(jié)存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為0~255的數(shù)值或字符串。DCB也可用“=〞代替
2.DCW(DCWU)格式:標號DCW〔或DCWU〕表達式功能:DCW〔或DCWU〕偽操作用于分配一片連續(xù)的半字存儲單元并用偽操作中指定的表達式初始化。其中,表達式可以為程序標號或數(shù)值表達式。用DCW分配的字存儲單元是半字對齊的,而用DCWU分配的字存儲單元并不嚴格按照半字對齊。3.DCD〔或DCDU〕格式:標號DCD〔或DCDU〕表達式功能:DCD〔或DCDU〕偽操作用于分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。其,表達式可以為程序標號或數(shù)值表達式。DCD也可用“&〞代替。用DCD分配的字存儲單元是字對齊的,而用DCDU分配的字存儲單元并不嚴格按照字對齊。
使用例如:StrDCB“Thisisatest!〞;分配一片連續(xù)的字節(jié)存儲單元并初始化。DataTestDCW1,2,3;分配一片連續(xù)的半字存儲單元并初始化。DataTestDCD4,5,6;分配一片連續(xù)的字存儲單元并初始化。4、DCFD〔或DCFDU〕
語法格式:
標號DCFD〔或DCFDU〕表達式
DCFD〔或DCFDU〕偽操作用于為雙精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。每個雙精度的浮點數(shù)占據(jù)兩個字單元
如:FDataTestDCFD2E115,-5E7;分配一片連續(xù)的字存儲單元并初始化為指定的雙精度數(shù)。5、DCFS〔或DCFSU〕
語法格式:
標號DCFS〔或DCFSU〕表達式
DCFS〔或DCFSU〕偽操作用于為單精度的浮點數(shù)分配一片連續(xù)的字存儲單元并用偽操作中指定的表達式初始化。每個單精度的浮點數(shù)占據(jù)一個字單元。6、DCQ(或DCQU〕
語法格式:
標號DCQ〔或DCQU〕表達式
DCQ〔或DCQU〕偽操作用于分配一片以8個字節(jié)為單位的連續(xù)存儲區(qū)域并用偽操作中指定的表達式初始化。如:DataTestDCQ100;分配一片連續(xù)的存儲單元并初始化為指定的值。
7、SPACE
語法格式:
標號SPACE表達式
SPACE偽指令用于分配一片連續(xù)的存儲區(qū)域并初始化為0。其中,表達式為要分配的字節(jié)數(shù)。
SPACE也可用“%〞代替。
使用例如:
DataSpaceSPACE100;分配連續(xù)100字節(jié)的存儲單元并初始化為0。8、MAP
語法格式:
MAP表達式{,基址存放器}
MAP偽指令用于定義一個結(jié)構(gòu)化的內(nèi)存表的首地址。MAP也可用“^〞代替。
表達式可以為程序中的標號或數(shù)學表達式,基址存放器為可選項,當基址存放器選項不存在時,表達式的值即為內(nèi)存表的首地址,當該選項存在時,內(nèi)存表的首地址為表達式的值與基址存放器的和。
MAP偽操作通常與FIELD偽指令配合使用來定義結(jié)構(gòu)化的內(nèi)存表。
使用例如:
MAP0x100,R0;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100+R0。9、FIELD
語法格式:
標號FIELD表達式
FIELD偽指令用于定義一個結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。FILED也可用“#〞代替。
表達式的值為當前數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。
MAP偽操作定義內(nèi)存表的首地址,F(xiàn)IELD偽操作定義內(nèi)存表中的各個數(shù)據(jù)域,并可以為每個數(shù)據(jù)域指定一個標號供其他的指令引用。注意MAP和FIELD偽指令僅用于定義數(shù)據(jù)結(jié)構(gòu),并不實際分配存儲單元。
使用例如:
MAP0x100;定義結(jié)構(gòu)化內(nèi)存表首地址的值為0x100。
AFIELD16;定義A的長度為16字節(jié),位置為0x100
BFIELD32;定義B的長度為32字節(jié),位置為0x110
SFIELD256;定義S的長度為256字節(jié),位置為0x130
10、LTORGLTORG用于聲明一個數(shù)據(jù)緩沖池〔也稱為文字池〕的開始。在使用偽操作LDR時,常常需要在適當?shù)牡胤絽⒓覮TORG聲明數(shù)據(jù)緩沖池,LDR加載的數(shù)據(jù)暫時放于數(shù)據(jù)緩沖池。語法格式LTORG使用說明當程序中使用LDR之類的指令時,數(shù)據(jù)緩沖池的使用可能越界。為防止越界發(fā)生可以使用LTORG偽操作定義數(shù)據(jù)緩沖池。通常大的代碼段可以使用多個數(shù)據(jù)緩沖池。ARM匯編編譯器一般把數(shù)據(jù)緩沖池放在代碼段的最后面,即下一個代碼段開始之前,或者END偽操作之前。【例】顯示定義文字池例如AREA
Example,CODE,READONLY;
//聲明一個代碼段,名稱為Example,屬性為只讀Start
BL
funcl
;codefuncl
//子程序
;code
LDR
R1,=0x800
//將0X800加載到R1
MOV
PC,lr
//子程序結(jié)束LTORG
//定義數(shù)據(jù)緩沖池data
SPACE4200
//從當前開始分配40字節(jié)的內(nèi)存單元并初始化為0END
//程序結(jié)束
0x800的值被編譯器暫時放在了data[0-3]字段中。
4.3.1.3ARM7匯編控制偽操作
1.IF、ELSE、ENDIF條件編譯偽操作2.WHILE、WEND條件編譯偽操作3.MACRO、MEND宏定義偽操作4.MEXIT宏退出偽操作〔1〕IF、ELSE、ENDIF
語法格式:
IF邏輯表達式
指令序列1
ELSE
指令序列2
ENDIF
IF、ELSE、ENDIF偽操作能根據(jù)條件的成立與否決定是否執(zhí)行某個指令序列。當IF后面的邏輯表達式為真,那么執(zhí)行指令序列1,否那么執(zhí)行指令序列2。其中,ELSE及指令序列2可以沒有,此時,當IF后面的邏輯表達式為真,那么執(zhí)行指令序列1,否那么繼續(xù)執(zhí)行后面的指令。
IF、ELSE、ENDIF偽操作可以嵌套使用。
使用例如:
GBLLTest;聲明一個全局的邏輯變量,變量名為Test……
IFTest=TRUE
指令序列1
ELSE
指令序列2
ENDIF
語法格式:
WHILE邏輯表達式
指令序列
WEND
WHILE、WEND偽操作能根據(jù)條件的成立與否決定是否循環(huán)執(zhí)行某個指令序列。當WHILE后面的邏輯表達式為真,那么執(zhí)行指令序列,該指令序列執(zhí)行完畢后,再判斷邏輯表達式的值,假設(shè)為真那么繼續(xù)執(zhí)行,一直到邏輯表達式的值為假。
WHILE、WEND偽指令可以嵌套使用。
使用例如:
GBLACounter;聲明一個全局的數(shù)學變量,變量名為Counter
CounterSETA3;由變量Counter控制循環(huán)次數(shù)
……
WHILECounter<10
指令序列
WEND
〔2〕WHILE、WEND
3、MACRO、MEND
語法格式:
$標號宏名$參數(shù)1,$參數(shù)2,……
指令序列
MEND
MACRO、MEND偽指令可以將一段代碼定義為一個整體,稱為宏指令,然后就可以在程序中通過宏指令屢次調(diào)用該段代碼。其中,$標號在宏指令被展開時,標號會被替換為用戶定義的符號,宏指令可以使用一個或多個參數(shù),當宏指令被展開時,這些參數(shù)被相應的值替換。
宏指令的使用方式和功能與子程序有些相似,子程序可以提供模塊化的程序設(shè)計、節(jié)省存儲空間并提高運行速度。但在使用子程序結(jié)構(gòu)時需要保護現(xiàn)場,從而增加了系統(tǒng)的開銷,因此,在代碼較短且需要傳遞的參數(shù)較多時,可以使用宏指令代替子程序。
包含在MACRO和MEND之間的指令序列稱為宏定義體,在宏定義體的第一行應聲明宏的原型〔包含宏名、所需的參數(shù)〕,然后就可以在匯編程序中通過宏名來調(diào)用該指令序列。在源程序被編譯時,匯編器將宏調(diào)用展開,用宏定義中的指令序列代替程序中的宏調(diào)用,并將實際參數(shù)的值傳遞給宏定義中的形式參數(shù)。
MACRO、MEND偽操作可以嵌套使用。MACRO、MENDMACRO偽操作標識宏定義的開始,MEND標識宏定義的結(jié)束。用MACRO和MEND定義的一段代碼,稱為宏定義體,這樣在程序中就可以通過宏名屢次調(diào)用該代碼段來完成相應的功能。語法格式 MACRO {$label}macroname{$parameter{,$parameter}…} … ;宏代碼 MENDmacroname為所定義的宏的名稱;$label在宏指令被展開時,label可被替換成相應的符號,通常是一個標號?!苍谝粋€符號前使用$表示程序被匯編時將使用相應的值來替代$后的符號〕;$parameter為宏指令的參數(shù),當宏指令被展開時將被替換成相應的值,類似于函數(shù)中的形式參數(shù)。可以在宏定義時為參數(shù)指定相應的默認值。宏的定義體:
MACRO
$PM
DELAY
$CanShu
$PM
LDR
R7,=$CanShu
;
;LDR
R7,[R7]
;此時參數(shù)是一個立即數(shù)
如果是變量的話是會用到這一句
$PM.LOOP
SUBS
R7,R7,#0X01
BNE
$PM.LOOP
MEND在程序段中的使用:〔使用兩次〕...AA
DELAY
0X000005F0...BB
DELAY
0X00000FF0...此時調(diào)用屢次,編譯器就不會出現(xiàn)問題,例子中的AA和BB僅僅是一個標號,用戶可以自行書寫,因為在宏指令唄展開時,這個符號在匯編時將使用相應的值替代0x00000FF0是一個參數(shù)在此處是一個立即數(shù),用戶可自行使用為變量等4、MEXIT
語法格式:
MEXIT
MEXIT用于從宏定義中跳轉(zhuǎn)出去。如:
MACRO
$abcmacroabc$param1,$param2
;code
WHILEcondition1
;code
IFcondition2
;code
MEXIT<----直接退出宏
ELSE
;code
ENDIF
WEND4.3.1.4雜項匯編器偽指令1.AREA2.ALIGN3.CODE16和CODE324.ENTRY5.ENDEQU7.EXPORT和GLOBAL8.IMPORT9.EXTERN10.GET和INCLUDE11.INCBIN12.RN13.ROUT1.AREA格式:AREA段名屬性1,屬性2,…… 功能:AREA偽操作用于定義一個代碼段、數(shù)據(jù)段或特定屬性的段。其中,段名假設(shè)以數(shù)值開頭,那么該段名需用“|〞括起來,如|1_test|,用C的編譯器產(chǎn)生的代碼一般也用“|〞括起來。屬性字段表示該代碼段〔或數(shù)據(jù)段〕的相關(guān)屬性,多個屬性用逗號分隔。使用例如:AREAInit,CODE,READONLY;定義段Init,代碼段,只讀ENTRY;程序入口…;指令序列BSTART1
AREASTOCK,DATA,READWRITE;定義段STOCK,數(shù)據(jù)段,讀/寫SAVESPACE20;分配數(shù)據(jù)空間AREAInit,CODE,READONLY;定義段Init,代碼段,只讀START1ADDR1,R2,R3…;指令序列BSTART12.CODE16、CODE32格式:CODE16〔或CODE32〕功能:(1)CODE16偽操作通知編譯器,其后的指令序列為16位的Thumb指令。(2)CODE32偽操作通知編譯器,其后的指令序列為32位的ARM指令。使用例如:AREAInit,CODE,READONLY…CODE32;通知編譯器其后的指令為32位的ARM指令LDRR0,=NEXT+1;將跳轉(zhuǎn)地址放入存放器R0BXR0;程序跳轉(zhuǎn)到新的位置執(zhí)行,;并將處理器切換到Thumb工作狀態(tài)…CODE16;通知編譯器其后的指令為16位的Thumb指令NEXTLDRR3,=0x3FF …END;程序結(jié)束
3.ENTRY格式:ENTRY功能:ENTRY偽操作用于指定匯編程序的入口點。一個程序可由一個或多個源文件組成,一個源文件由一個或多個程序段組成。一個程序至少有一個入口,在只有一個入口時,編譯程序會把這個入口的地址定義為系統(tǒng)復位后的程序的起始點。使用例如:AREAInit,CODE,READONLYENTRY;指定應用程序的入口點…4.END格式:END功能:END偽操作用于通知編譯器已經(jīng)到了源程序的結(jié)尾。例4.33使用例如:AREAInit,CODE,READONLY……END;指定應用程序的結(jié)尾
5.EQU格式:名稱EQU表達式{,類型}功能:EQU偽操作用于為程序中的常量、標號等定義一個等效的字符名稱,類似于C語言中的#define。使用例如:TestEQU50;定義標號Test的值為50AddrEQU0x55;定義Addr的值為0x556.EXPORT〔或GLOBAL〕格式:EXPORT標號[,WEAK]功能:EXPORT偽操作用于在程序中聲明一個全局的標號,該標號可在其它的文件中引用。使用例如:AREAInit,CODE,READONLYEXPORTStest;聲明一個可全局引用的標號Stest……END7.IMPORT格式:IMPORT標號[,WEAK]功能:IMPORT偽操作用于通知編譯器要使用的標號在其它的源文件中定義,但要在當前源文件中引用,而且無論當前源文件是否引用該標號,該標號均會被參加到當前源文件的符號表中。標號在程序中區(qū)分大小寫。使用例如:
AREAInit,CODE,READONLYIMPORTMain…END通知編譯器當前文件要引用標號Main,但Main在其它源文件中定義8.GET〔或INCLUDE〕格式:GET文件名功能:GET偽操作用于將一個源文件包含到當前的源文件中,并將被包含的源文件在當前位置進行匯編處理??梢允褂肐NCLUDE代替GET。使用例如:AREAInit,CODE,READONLYGETa1.s;通知編譯器當前源文件包含源文件a1.sGETC:\a2.s;通知編譯器當前源文件包含源文件C:\a2.s…END
9.INCBIN格式:INCBIN文件名功能:INCBIN偽操作用于將一個目標文件或數(shù)據(jù)文件包含到當前的源文件中,被包含的文件不作任何變動地存放在當前文件中,編譯器從其后開始繼續(xù)處理。使用例如:AREAInit,CODE,READONLYGETa1.sINCBINC:\a2.txt…
END分析:使用GET包含文件時,由于必須對包含文件進行編譯,所以被包含的文件只能是源文件。而使用INCBIN包含文件時,可以是其它類型的文件。 ;通知編譯器當前源文件包含文件a1.s,并編譯;通知編譯器當前源文件包含文件c:\a2.txt,不編譯10.RN格式:名稱RN表達式功能:RN偽操作用于給一個存放器定義一個別名。采用這種方式可以方便程序員記憶該存放器的功能。其中,名稱為給存放器定義的別名,表達式為存放器的編碼。
使用例如:TempRNR0;將R0定義一個別名TempARM7匯編語言程序框架段:ARM匯編程序由段組成〔程序段、數(shù)據(jù)段〕;段是由匯編器偽指令AREA定義的相對獨立程序塊;段的屬性:READONLY〔只讀〕或READWRITE〔讀寫〕分別用于定義一個代碼段或數(shù)據(jù)段;ARM7匯編語言程序框架;文件名:TEST1.S;功能:實現(xiàn)字符串拷貝功能;說明:使用ARMulate軟件仿真調(diào)試 AREA Example1,CODE,READONLY;聲明代碼段Example1numEQU20 ;設(shè)置拷貝字的個數(shù) ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令START LDR R0,=src;R0指向源數(shù)據(jù)塊 LDR R1,=dst;R1指向目的數(shù)據(jù)塊 MOV R2,#num;R2需要拷貝的數(shù)據(jù)個數(shù)wordcopy LDR R3,[R0],#4;從源數(shù)據(jù)塊中取一個字,放入R3中, ;R0=R0+4 STR R3,[R1],#4 ;將R3中的數(shù)據(jù)存入R1指向的存儲 ;單元中,R1=R1+4 SUBS R2,R2,#1 ;R2計數(shù)器減1 BNE wordcopy ;如果R2不為0,那么轉(zhuǎn)向wordcopy處使用“;〞進行注釋標號頂格寫程序代碼段ARM7匯編語言程序框架stop MOV R0,#0x18 ;程序運行結(jié)束返回編譯器調(diào)試環(huán)境
LDR R1,=0x20026 SWI 0x123456
AREABlockData,DATA,READWRITE ;數(shù)據(jù)段的名字BlockDataSrc DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4Dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 AREA|.extra|,NOINIT,READWRITE ;未初始數(shù)據(jù)段的名字.extradata SPACE 1024 END ;文件結(jié)束
聲明文件結(jié)束4.3.2ARM7匯編語言程序設(shè)計步驟
ARM7匯編語言程序的設(shè)計步驟
編輯匯編語言源程序
聯(lián)編匯編語言源程序
調(diào)試可執(zhí)行映像文件4.3.2.1ARM匯編語言程序的設(shè)計步驟匯編語言程序的設(shè)計步驟分為編輯、匯編、連接和調(diào)試。4.3.2.2編輯匯編語言源程序基于Windows操作系統(tǒng)平臺的ARMADS〔ARMDeveloperSuite〕軟件下進行的,該軟件是由ARM公司提供的專門用于ARM處理器應用開發(fā)和調(diào)試的綜合性工具軟件,目前使用的ADS1.2版本。ADS1.2主要包含CodeWarriorIDE、AXD兩局部;CodeWarriorIDE工具主要用于工程的管理配置、源程序的編輯、編譯和鏈接;AXD主要用于工程的下載和調(diào)試。1.建立工程文件2.創(chuàng)立源文件3.添加源文件到工程中4.3.2.3聯(lián)編匯編語言源程序4.3.2.4調(diào)試可執(zhí)行映像文件4.3.3ARM7匯編語言程序設(shè)計
匯編語言程序設(shè)計的步驟
順序程序設(shè)計
分支程序設(shè)計
循環(huán)程序設(shè)計
子程序設(shè)計4.3.3.1匯編語言程序設(shè)計的步驟使用計算機通過編程序解決某一問題時,通常按以下步驟進行:分析問題,建立數(shù)學模型;確定算法;設(shè)計程序流程圖;合理分配存放器、存儲空間和外設(shè)資源;編制程序;調(diào)試程序;形成文檔;研討目標系統(tǒng)的本質(zhì)特性,用數(shù)學方法對其本質(zhì)特性進行抽象描述,建立目標系統(tǒng)的數(shù)學表示模型
在已建立的目標系統(tǒng)數(shù)學表示模型上,進一步研討目標系統(tǒng)的內(nèi)在規(guī)那么,設(shè)計相應處理法那么方案〔算法分析與描述〕把解題的方法、步驟用框圖形式表示。如果問題比較復雜,那么可以逐步細化,直到每一框圖可以容易編程為止。流程圖不僅便于程序的編制,且對程序邏輯正確性也比較容易查找和修改。①合理地分配存儲器資源,將前述的目標系統(tǒng)‘數(shù)據(jù)結(jié)構(gòu)模型’表示到各存儲器單元。②CPU存放器數(shù)量有限,在程序中,大多數(shù)操作都要使用存放器;并且有的操作使用特定的存放器〔如堆棧操作使用SP/R13等〕,程序中要合理分配各存放器的用途。用計算機語言,對數(shù)據(jù)結(jié)構(gòu)模型和流程圖表示的算法進行準確地描述。①語法調(diào)試:排除程序中的語法錯誤。②功能調(diào)試:保證程序的邏輯功能正確性。用文檔形式記錄說明程序的功能、使用方法、程序結(jié)構(gòu)、算法流程等每一個階段的工作。4.3.3.2順序程序設(shè)計順序程序是一種最簡單的程序結(jié)構(gòu),也稱為直線程序,它的執(zhí)行自始自終按照語句的先后順序進行。這種結(jié)構(gòu)的流程圖,除了有一個起始框,一個終止框外,就是假設(shè)干執(zhí)行框。例試編制一程序,完成10+3的操作。 AREAARMex,CODE,READONLY ;代碼段名ARMex ENTRY ;程序的入口 CODE32start MOV R0, #10 ;將立即數(shù)10存入存放器R0 MOV R1, #3 ;將立即數(shù)3存入存放器R1 ADD R0, R0, R1 ;R0=R0+R1stop MOV R0, #0x18 ;這三條指令是ADS調(diào)試環(huán)境特約 LDR R1, =0x20026 ;程序運行結(jié)束返回編譯器調(diào)試環(huán)境 SWI 0x123456 END ;結(jié)束4.3.3.3分支程序設(shè)計許多實際問題需要根據(jù)不同的情況作出不同的處理。在程序中,針對不同的情況把不同的處理方法編制成各自的處理程序段,運行時由機器根據(jù)當時的條件自動作出判斷,選擇執(zhí)行相應的處理程序段。這樣的程序結(jié)構(gòu)中,計算機不再完全按指令存儲的順序執(zhí)行,稱之為分支。分支程序使用轉(zhuǎn)移指令B、子程序調(diào)用指令BL或帶狀態(tài)轉(zhuǎn)移指令BX來實現(xiàn)。例4?2給定以下符號函數(shù):
任意給定值,假定為-25,存放在x單元,函數(shù)值存放在y單元;要求根據(jù)x中的值來確定y的值。
R3=-1R3=0 AREAsymbol,CODE,READONLY ;代碼段的名字symbol ENTRY ;程序的入口 CODE32start LDRR0,=x ;加載數(shù)據(jù)段中的變量x地址,存入R0 LDRR1,=y ;加載數(shù)據(jù)段中的變量y地址,存入R1 LDR R2,[R0] ;加載變量x的值,存入R2compare CMP R2,#0 ;將R2的值與0作比較 BEQ ZERO ;如果R2等于0,那么轉(zhuǎn)向標號ZERO處 BGT PLUS ;如果R2大于0,那么轉(zhuǎn)向標號PLUS處 MOV R3,#-1 ;否那么,R2小于0,將-1存入R3中 B stopZERO MOV R3,#0 ;R2等于0,將0存入R3中 B stopPLUS MOV R3,#1 ;R2大于0,將1存入R3中;續(xù)上段代碼stop STR R3,[R1]
MOV R0,#0x18 LDR R1,=0x20026 SWI 0x123456
AREAData,DATA,READWRITEx DCD -25y DCD 0 END4.3.3.5循環(huán)程序設(shè)計順序程序和分支程序中的指令每次運行最多只執(zhí)行一次。在實際應用中重復地做某些事的情況很多,這也是計算機最擅長的工作方式。重復地執(zhí)行某些指令,最好用循環(huán)程序來實現(xiàn)。循環(huán)程序的結(jié)構(gòu)---重復地執(zhí)行同一種運算,直到某種條件滿足。初始化循環(huán)體修改判斷判斷結(jié)束循環(huán)程序的主體業(yè)務代碼,可以是一個順序程序、分支程序或另一個循環(huán)程序。例如:計數(shù)控制循環(huán);通過計數(shù)循環(huán)次數(shù),判斷是否已到達預定次數(shù),控制循環(huán)。條件控制循環(huán):通過判斷循環(huán)終止條件是否已成立,控制循環(huán)。建立循環(huán)初始值。如設(shè)置地址指針、計數(shù)器、其他循環(huán)參數(shù)的起始值等。判斷循環(huán)結(jié)束條件是否成立,決定是否繼續(xù)循環(huán)。對循環(huán)結(jié)束進行適當處理;有的循環(huán)程序可以沒有這局部。為執(zhí)行下一個循環(huán)而修改某些參數(shù),尤其循環(huán)控制變量的修改等。
用計數(shù)控制循環(huán) 適用于循環(huán)次數(shù)的循環(huán)程序設(shè)計例4?4從x單元開始的30個連續(xù)字單元中存放有30個無符號數(shù),從中找出最大者送入y單元中。分析:根據(jù)題意,把第一個數(shù)先送入Rx存放器,將Rx中的數(shù)與后面的29個數(shù)逐個進行比較,如果Rx中的數(shù)較小,那么將該較大的數(shù)送入Rx;繼續(xù)與余下的數(shù)據(jù)逐個比較。在比較過程中,Rx中始終保持較大的數(shù),共計比較29次,那么最終Rx中保存了最大數(shù),最后把Rx中的數(shù)〔最大者〕送入y單元。 AREAmax,CODE,READONLY ;代碼段的名字max ENTRY ;程序的入口 CODE32num EQU 29;比較的次數(shù)start LDR R0,=x;R0指向源數(shù)據(jù)塊x LDR R1,=y;R1指向單元y LDR R2,=num;R2作為計數(shù)器 LDR R3,[R0];將源數(shù)據(jù)塊x中第一個數(shù)加載到R3中compare ADD R0,R0, #;每進行一次比較,將R0指針地址加4 LDR R4,[R0];依次將源數(shù)據(jù)塊x中下一個數(shù)加載到R4中 CMP R3,R4;比較R3和R4中數(shù)的大小 MOVCCR3,R4;如果R3小于R4,那么將較大的數(shù)送入R3中 SUBS R2,R2,#;計數(shù)器值減1 BNE compare;如果不為0,那么繼續(xù)跳到compare執(zhí)行 STREQ R3,[R1];如果為0,那么循環(huán)比較結(jié)束,R3是最大的數(shù) ;并且將R3中的數(shù)加載到R1指向的單元〔即y〕中stop MOV r0,#0x18 LDR r1,=0x20026 SWI 0x123456 AREAData,DATA,READWRITEx DCD 73,59,61,34,81,107,225,231,54,43 DCD 100,35,1,42,222,254,34,71,100,31 DCD 33,119,13,44,18,147,55,244,97,3y DCD 0 END② 適用于循環(huán)條件的循環(huán)程序設(shè)計適用于無法確定循環(huán)次數(shù),但知道循環(huán)結(jié)束的條件例4?5從自然數(shù)1開始累加,直到累加和大于1000為止,統(tǒng)計被累加的自然數(shù)的個數(shù),并把統(tǒng)計的個數(shù)送入n單元,把累加和送入sum單元。分析:根據(jù)題意,被累加的自然數(shù)的個數(shù)事先未知,因此不能用計數(shù)方法控制循環(huán)。但題目中給定一個條件,即累加和大于1000那么停止累加,因此,可以根據(jù)這一條件控制循環(huán)。我們用R3存放器放累加和,用R4存放器放每次取得的自然數(shù),其中它的值也是統(tǒng)計自然數(shù)的個數(shù)。AREASUM,CODE,READONLY ;代碼段的名字SUMENTRY ;程序的入口CODE32startLDRR0,=n;將數(shù)據(jù)段中自然數(shù)的個數(shù)n的地址加載到R0存放器LDRR1,=sum;將數(shù)據(jù)段中自然數(shù)的累加和sum的地址加載到R1存放器LDRR3,=0;R3存放自然數(shù)的累加和LDRR4,=0;R4用于循環(huán)個數(shù)的統(tǒng)計/每次取得的自然數(shù)LDRR5,=1000;R5用于循環(huán)結(jié)束的界限值continueADD R4,R4, #1;取下一個自然數(shù)ADD R3,R3, R4;累加自然數(shù)CMP R3,R5;比較累加和是否超過了1000BCC continue;如果小于1000,那么跳到compare執(zhí)行STRCSR3,[R1];如果大于1000,那么將累加和存儲到R1所指向的單元中STRCSR4,[R0];如果大于1000,那么將已累加的自然數(shù)個數(shù)值存儲 ;到R0所指向的單元中stopMOVr0,#0x18LDRr1,=0x20026 SWI0x123456
AREAData,DATA,READWRITEn DCD 0 ;定義累加的自然數(shù)的個數(shù)sum DCD 0 ;定義自然數(shù)的累加和
END4.3.3.6子程序設(shè)計子程序概念
如果在一個程序中的多處用到同一段程序代碼,那么可以把這段共同的程序代碼抽取出來,寫成一個相對獨立的程序段,每當需要執(zhí)行這段代碼時,就調(diào)用這個程序段,執(zhí)行完這個程序段后,再返回原來調(diào)用它的程序。這樣編寫程序時,就不必重復寫這段代碼了,而這樣的程序段稱為子程序或子過程。子程序的調(diào)用與返回主程序中使用BL指令實現(xiàn)子程序的調(diào)用
BL 子程序名在子程序結(jié)束處,使用如下指令返回到主程序中。
MOV PC, LR主程序與子程序之間的參數(shù)傳遞
主程序調(diào)用子程序時,可以向子程序傳遞一些參數(shù);同樣,子程序運行后也可把一些結(jié)果參數(shù)傳回給主程序。主程序與子程序之間的這種信息傳遞稱為參數(shù)傳遞。三種參數(shù)傳遞方式 ①存放器傳遞參數(shù)方式 ②存儲區(qū)域傳遞參數(shù)方式 ③堆棧傳遞參數(shù)方式存放器傳遞參數(shù)方式技術(shù)思想:主程序?qū)⒋齻鬟f的數(shù)據(jù)直接寫入約定的通用存放器,在子程序中直接使用;或子程序返回后,主程序直接從約定的通用存放器中獲得子程序的結(jié)果數(shù)據(jù)。應用特點:這種方式適合于傳遞較少參數(shù)的應用場合。例4?5用子程序?qū)崿F(xiàn)內(nèi)存區(qū)里的字符串拷貝功能,即將存儲單元中源字符串對應拷貝到目的字符串中。解題思路:通過設(shè)定兩個地址指針,分別指向存儲區(qū)中的源字符串和目的字符串;然后通過加載和存儲指令〔LDR和STR〕的存放器間接尋址方式,依次從源字符串讀取一個字符數(shù)據(jù),寫入到目的字符串的對應字符位置中,直到遇到源字符串的結(jié)束標志’\0’為止。
AREAStrCopy,CODE,READONLYENTRYCODE32startLDRR1,=srcstr;R1指向數(shù)據(jù)區(qū)的源字符串
LDRR0,=dststr;R0指向數(shù)據(jù)區(qū)的目的字符串
BLstrcopy;調(diào)用子程序strcopy,完成字符串拷貝stopMOVR0,#0x18 ;程序結(jié)束返回編譯器調(diào)試環(huán)境
LDRR1,=0x20026SWI0x123456strcopyLDRBR2,[R1],#1;將R1指向的單元內(nèi)容加載到R2中
STRBR2,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 發(fā)電用蒸汽機鍋爐非陸地車輛用產(chǎn)品供應鏈分析
- 投標報價行業(yè)相關(guān)項目經(jīng)營管理報告
- 河南省豫西北教研聯(lián)盟(許洛平)2024-2025學年高三上學期一模英語試題 含解析
- 舞臺燈光調(diào)節(jié)器市場發(fā)展前景分析及供需格局研究預測報告
- 區(qū)塊鏈社交網(wǎng)絡行業(yè)相關(guān)項目經(jīng)營管理報告
- 醫(yī)學研究行業(yè)營銷策略方案
- 網(wǎng)絡攝像機市場發(fā)展前景分析及供需格局研究預測報告
- 藥用蛋白胨市場發(fā)展前景分析及供需格局研究預測報告
- 動作識別傳感器產(chǎn)業(yè)鏈招商引資的調(diào)研報告
- 在線數(shù)據(jù)存儲服務行業(yè)營銷策略方案
- 2024年大巴車租賃合同參考樣本(二篇)
- 第六單元 (單元測試)-2024-2025學年語文四年級上冊單元速記·巧練系列(統(tǒng)編版)
- 第四單元測試卷(五)(單元測試)-2024-2025學四年級語文上冊統(tǒng)編版
- 2024年肥胖癥診療指南要點解讀課件
- Module8 Unit1 She goes swimming(教學設(shè)計)-2023-2024學年外研版(一起)英語二年級上冊
- 河南省2024年中考地理試卷【附參考答案】
- 1.1 公有制為主體 多種所有制經(jīng)濟共同發(fā)展 課件高中政治統(tǒng)編版必修二經(jīng)濟與社會
- 外研版小學英語六年級上冊教學反思全冊
- 第三單元閱讀綜合實踐教學課件 七年級語文上冊同步課堂(統(tǒng)編版2024)
- 浙教版九年級上冊數(shù)學期中考試試卷含答案
- 期中檢測試卷(1-4單元)(試題)-2024-2025學年三年級上冊數(shù)學人教版
評論
0/150
提交評論