![ARM匯編語(yǔ)言編程詳解_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/feceae2c-6cce-4154-9ff1-c262dfd2dfde/feceae2c-6cce-4154-9ff1-c262dfd2dfde1.gif)
![ARM匯編語(yǔ)言編程詳解_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/feceae2c-6cce-4154-9ff1-c262dfd2dfde/feceae2c-6cce-4154-9ff1-c262dfd2dfde2.gif)
![ARM匯編語(yǔ)言編程詳解_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/feceae2c-6cce-4154-9ff1-c262dfd2dfde/feceae2c-6cce-4154-9ff1-c262dfd2dfde3.gif)
![ARM匯編語(yǔ)言編程詳解_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/feceae2c-6cce-4154-9ff1-c262dfd2dfde/feceae2c-6cce-4154-9ff1-c262dfd2dfde4.gif)
![ARM匯編語(yǔ)言編程詳解_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2022-1/15/feceae2c-6cce-4154-9ff1-c262dfd2dfde/feceae2c-6cce-4154-9ff1-c262dfd2dfde5.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 ARM匯編語(yǔ)言編程詳解 硅谷芯微嵌入式學(xué)院技術(shù)貢獻(xiàn)網(wǎng)址:www.threeway.cc 4.1 匯編語(yǔ)言使用匯編語(yǔ)言編寫(xiě)程序,它的特點(diǎn)是程序執(zhí)行速度快,程序代碼生成量少,但匯編語(yǔ)言是一種不易學(xué)習(xí)的編程語(yǔ)言,并且可讀性較差,這種語(yǔ)言屬于低級(jí)語(yǔ)言。每一種匯編語(yǔ)言對(duì)應(yīng)每一款芯片,使用這種語(yǔ)言需要對(duì)硬件有深刻的了解。在通常情況下,可以使用匯編語(yǔ)言編寫(xiě)驅(qū)動(dòng)程序、需要嚴(yán)格計(jì)算執(zhí)行時(shí)間的程序以及需要加速執(zhí)行的程序。 先介紹一個(gè)例子來(lái)說(shuō)明ARM匯編程序的格式。例1 計(jì)算20+8,結(jié)果放入R0寄存器。AREA Buf, DATA, READWRITE ;聲明數(shù)據(jù)段Buf Count DCB 20 ;定義一個(gè)字
2、節(jié)單元Count AREA Example, CODE, READONLY ;聲明代碼段ExampleENTRY ;標(biāo)識(shí)程序入口CODE32 ;聲明32位ARM指令STARTLDRB R0, Count ;R0 = Count =20MOV R1, #8 ;R1 = 8ADD R0, R0, R1 ;R0 = R0 + R1B STARTEND 例1中定義了兩個(gè)段:數(shù)據(jù)段Buf和代碼段Example 。數(shù)據(jù)段中定義了字節(jié)單元Count,其中Count用來(lái)保存一個(gè)被加數(shù);代碼段中包含了所有源程序代碼,程序中首先讀取Count字節(jié)單元的內(nèi)容,然后與立即數(shù)8相加,計(jì)算結(jié)果保存到R0中。由例1可見(jiàn),A
3、RM匯編語(yǔ)言的源程序是分段的,由若干個(gè)段組成一個(gè)源程序。源程序的一般格式為:AREA name1, attr ;聲明特定的段標(biāo)號(hào)語(yǔ)句1 ;語(yǔ)句.語(yǔ)句nAREA name2, attr標(biāo)號(hào)語(yǔ)句n+1.語(yǔ)句n+mEND ;結(jié)束符 每一個(gè)段都有一個(gè)名字,并且段名是唯一的。每個(gè)段以符號(hào)AREA作為段的開(kāi)始,以碰到下一個(gè)符號(hào)AREA 作為該段的結(jié)束。段都有自己的屬性,如是代碼段( CODE還是數(shù)據(jù)段(DATA,是只讀(READONLY 還是可讀寫(xiě)(READWRITE?這些屬性可以在attr欄中設(shè)定。注意:符號(hào)AREA和END都不能頂格寫(xiě),只有標(biāo)號(hào)可以而且必須頂格寫(xiě)。 ARM匯編源程序是由若干段組成的,而
4、一個(gè)段又是由若干個(gè)語(yǔ)句行組成。語(yǔ)句就是完成一個(gè)動(dòng)作的說(shuō)明。源程序中的語(yǔ)句可以分為以下兩種類型:指令性語(yǔ)句:匯編程序會(huì)把指令性語(yǔ)句翻譯成機(jī)器代碼,然后利用這些機(jī)器代碼命令處理器執(zhí)行某些操作。如由MOV、ADD等指令構(gòu)造的語(yǔ)句。指示性語(yǔ)句:匯編程序并不把它們翻譯成機(jī)器代碼,只是用來(lái)指示、引導(dǎo)匯編程序在匯編時(shí)進(jìn)行一些操作。如由ENTRY、AREA等指令構(gòu)造的語(yǔ)句,我們也稱這些指令為偽指令。從例1可知,語(yǔ)句行的基本格式如下:標(biāo)號(hào) <指令> <操作數(shù)> ; 注釋 在一條語(yǔ)句中, 號(hào)中的內(nèi)容是可選的。在書(shū)寫(xiě)ARM匯編程序時(shí),需要注意以下3點(diǎn):標(biāo)號(hào)必須在一行的頂格書(shū)寫(xiě),其后面不要加“
5、:”,對(duì)于變量的設(shè)置、常量的定義,其標(biāo)識(shí)符必須在一行的頂格書(shū)寫(xiě);而所有指令均不能頂格書(shū)寫(xiě)。匯編器對(duì)標(biāo)識(shí)符大小寫(xiě)敏感,書(shū)寫(xiě)標(biāo)號(hào)及指令時(shí)字母大小寫(xiě)要一致。在ARM匯編程序時(shí),一個(gè)ARM指令、偽指令、寄存器名可以全部為大寫(xiě)字母,也可以全部為小寫(xiě)字母,但不要大小寫(xiě)混合使用。注釋使用“;”。注釋內(nèi)容由“;”開(kāi)始到此行結(jié)束,注釋可以在一行的頂格書(shū)寫(xiě)。例2 某一段錯(cuò)誤的匯編語(yǔ)言程序。 例2 某一段錯(cuò)誤的匯編語(yǔ)言程序。START MOV R0, #1 ;標(biāo)號(hào)START沒(méi)有頂格寫(xiě)ABC: MOV R1, #2 ;標(biāo)號(hào)后不能帶:MOV R2, #3 ;指令不允許頂格書(shū)寫(xiě)LOOP Mov R2, #3 ;指令中大小
6、寫(xiě)混合B loop ;無(wú)法跳轉(zhuǎn)到loop標(biāo)號(hào),只有LOOP標(biāo)號(hào) 任何一個(gè)匯編源程序都是由符號(hào)組成的。符號(hào)分為兩大類:指令助記符和用戶定義符。指令助記符包括ARM指令、偽指令等,這些符號(hào)都是預(yù)先定義好的,且具備專用的目的和功能;用戶定義符是由用戶在編寫(xiě)匯編程序時(shí)自行定義的,只在本程序中有意義,不具備通用性。本節(jié)所講的符號(hào)特指用戶定義符,符號(hào)的命名需注意以下規(guī)則:符號(hào)由大小寫(xiě)字母、數(shù)字以及下劃線組成。符號(hào)不能以數(shù)字開(kāi)頭(局部標(biāo)號(hào)除外。符號(hào)區(qū)分大小寫(xiě),且所有字符都是有意義的。符號(hào)在其作用域范圍內(nèi)必須是唯一的。符號(hào)不能與系統(tǒng)內(nèi)部或系統(tǒng)預(yù)定義的符號(hào)同名。符號(hào)不要以指令助記符、偽指令同名。符號(hào)可以代表地址
7、、數(shù)值、變量。當(dāng)符號(hào)代表地址時(shí)又稱為標(biāo)號(hào),符號(hào)代表某個(gè)特定數(shù)值時(shí)又稱為符號(hào)常量, 符號(hào)代表變量時(shí)又稱為變量名。所以符號(hào)有3個(gè)用途:標(biāo)號(hào)、符號(hào)常量、變量名。(1標(biāo)號(hào):標(biāo)號(hào)代表一個(gè)地址,段內(nèi)標(biāo)號(hào)的地址在匯編時(shí)確定,而段外標(biāo)號(hào)的地址值在鏈接時(shí)確定。根據(jù)標(biāo)號(hào)的生成方式可以分為以下3種:基于PC的標(biāo)號(hào):該標(biāo)號(hào)是位于目標(biāo)指令前的標(biāo)號(hào)或程序中的數(shù)據(jù)定義偽指令前的標(biāo)號(hào)。這種標(biāo)號(hào)在匯編時(shí)將被處理成PC值加上或減去一個(gè)數(shù)字常量。它常用于表示跳轉(zhuǎn)指令的目標(biāo)地址,或者代碼段中所嵌入的少量數(shù)據(jù)?;诩拇嫫鞯臉?biāo)號(hào):該標(biāo)號(hào)通常用MAP和FILED偽指令定義,也可以用于EQU偽指令定義。這種標(biāo)號(hào)在匯編時(shí)被處理成寄存器的值加上
8、或減去一個(gè)數(shù)字常量。它常用于訪問(wèn)位于數(shù)據(jù)段中的數(shù)據(jù)。 絕對(duì)地址:絕對(duì)地址是一個(gè)32位的數(shù)字量,可尋址的范圍為0232-1,可以直接尋址整個(gè)內(nèi)存空間。例3 標(biāo)號(hào)舉例。. ;.表示省略的程序B START ;程序跳轉(zhuǎn)到START標(biāo)號(hào)處.START ;START標(biāo)號(hào),這是一個(gè)基于PC的段內(nèi)標(biāo)號(hào) . (2符號(hào)常量:在程序運(yùn)行過(guò)程中,其值不能被改變的量稱為常量。常量區(qū)分為3種不同的類型:數(shù)字常量:數(shù)字常量表示某個(gè)特定的數(shù)字,如0、5、-19、0xF8都是數(shù)字常量。同一個(gè)數(shù)字常量可以有十進(jìn)制數(shù)、十六進(jìn)制數(shù)等多種表達(dá)方式。字符常量:字符常量由一對(duì)單引號(hào)及中間字符串表示,標(biāo)準(zhǔn)C語(yǔ)言中的轉(zhuǎn)義符也是也可使用。如果
9、需要包含雙引號(hào)或“$”,必須使用“”或“$”代替。如H是一個(gè)字符常量,“Hello World”是一個(gè)字符串常量。布爾常量:布爾常量由括號(hào)和邏輯值(TRUE、FALSE表示。邏輯真為T(mén)RUE,邏輯假為FALSE。為了程序書(shū)寫(xiě)的方便,可以用一個(gè)標(biāo)識(shí)符來(lái)代表一個(gè)常量,稱這個(gè)標(biāo)識(shí)符為符號(hào)常量,即標(biāo)識(shí)符形式的常量。 例4 用EQU偽指令定義數(shù)字符號(hào)常量。T_bit EQU 0x20 ;定義數(shù)字常量T_bit,其值為0x20 PLLCON EQU 0xE01FC080 ;定義PLLCON,值為0xE01FC080例子中定義了兩個(gè)數(shù)字符號(hào)常量:T_bit和PLLCON 。所以程序中用到這兩個(gè)符號(hào)常量時(shí),在
10、程序鏈接時(shí)就會(huì)被相應(yīng)的值0x20、0xE01FC080所替代。 (3變量名:變量是指存放在存儲(chǔ)單元的操作數(shù),并且它的值可以改變。變量名代表了一個(gè)變量,當(dāng)程序中要用到變量時(shí),只需要引用對(duì)應(yīng)的變量名。實(shí)際上,變量名是一個(gè)符號(hào)地址,當(dāng)程序編譯鏈接時(shí),系統(tǒng)會(huì)給每一個(gè)變量名分配一個(gè)內(nèi)存地址。在程序中從變量中取值,實(shí)際上是通過(guò)變量名找到相應(yīng)的內(nèi)存地址,從其存儲(chǔ)單元中讀取數(shù)據(jù)。按照變量的作用范圍可分為全局變量和局部變量;按照變量的數(shù)值類型可分為數(shù)字變量、字符變量和邏輯變量。根據(jù)兩種類型的組合,變量共具有6種類型:全局?jǐn)?shù)字變量、全局邏輯變量、全局字符串變量、局部數(shù)字變量、局部邏輯變量、局部字符串變量。具體對(duì)這
11、些類型的變量如何聲明、賦初值,將在4.1.2小節(jié)符號(hào)定義偽指令中詳細(xì)介紹。4.1.2 偽指令語(yǔ)句(1匯編語(yǔ)言程序由機(jī)器指令、偽指令和宏指令組成。偽指令不像機(jī)器指令那樣在處理器運(yùn)行期間由機(jī)器執(zhí)行,而是在對(duì)源程序進(jìn)行匯編期間由匯編工具處理的操作,它們可以完成如符號(hào)定義、數(shù)據(jù)定義、分配存儲(chǔ)區(qū)、指示程序開(kāi)始結(jié)束等功能。本小節(jié)只說(shuō)明一些常用的偽指令。另外,還有一些偽指令可查看相關(guān)手冊(cè)。在前面的ARM指令集章節(jié)中,已經(jīng)接觸了幾條常用的ARM偽指令,如ADR、ADRL、LDR、NOP等。把它們和指令集一起介紹是因?yàn)樗鼈冊(cè)趨R編時(shí)會(huì)被合適的機(jī)器指令代替,實(shí)現(xiàn)真正機(jī)器指令操作。偽指令大概可分為以下6種類型:ARM
12、偽指令,如ADR、LDR、NOP等,本節(jié)不再重復(fù)介紹。符號(hào)定義偽指令。段及段屬性定義偽指令。4.1.2 偽指令語(yǔ)句(2數(shù)據(jù)定義偽指令。匯編控制偽指令。雜項(xiàng)偽指令。 符號(hào)定義偽指令用于定義ARM 匯編程序的常量、標(biāo)號(hào)和變量,對(duì)變量進(jìn)行賦值等操作。符號(hào)定義偽指令包括EQU 偽指令、變量聲明偽指令、變量賦值偽指令。變量的聲明與賦值偽指令如表4.1所示。表4.1 變量聲明與賦值偽指令 (1EQU:EQU用于將程序中的數(shù)字常量、標(biāo)號(hào)、基于寄存器的值賦予一個(gè)等效的名稱,這一點(diǎn)類似于C語(yǔ)言中的#define,可用“*”代替EQU。指令格式如下:name EQU expr , type其中,name為要定義的
13、常量的名稱;expr可以為數(shù)字常量、程序中的標(biāo)號(hào)、32位地址常量、寄存器的地址值等;type指示expr的數(shù)據(jù)類型,是可選項(xiàng)。例5 EQU偽指令的使用。T_bit EQU 0x20 ;定義常量T_bit = 0x20 PLLCON EQU 0xE01F000C ;定義PLLCON = 0xE01F000C ABCD EQU label + 8 ;定義標(biāo)號(hào)ABCD = label +8 (2變量聲明偽指令:變量聲明偽指令包括全局變量聲明偽指令和局部變量聲明偽指令。全局變量聲明偽指令包括GBLA、GBLL 、GBLS,局部變量聲明偽指令包括LCLA、LCLL、LCLS 。全局變量多用于程序體中,而
14、局部變量用于宏定義體中。其中:GBLA、LCLA偽指令用于聲明一個(gè)數(shù)字變量,并將其初始化為0。GBLL、LCLL偽指令用于聲明一個(gè)邏輯變量,并將其初始化為FALSE。GBLS、LCLS偽指令用于聲明一個(gè)字符串變量,并將其初始化為空字符串。偽指令格式如下:GB/LCLA/L/S variable 其中,GB/LCLA/L/S為變量聲明偽指令,可以為6個(gè)變量聲明偽指令(GBLA、GBLL、GBLS、LCLA、LCLL、LCLS中的任一個(gè)。variable是定義的變量名,其數(shù)據(jù)類型和作用范圍由變量聲明偽指令來(lái)確定,但變量名在其作用內(nèi)必須唯一。例6 使用全局變量。GBLL codebg ;聲明一個(gè)全局
15、邏輯變量codebg codebg SETL TRUE ;設(shè)置變量為T(mén)RUE.例7 宏結(jié)構(gòu)中使用局部變量。MACRO ;聲明一個(gè)宏SENDDAT $dat ;宏的原型LCLA bitno ;聲明一個(gè)局部數(shù)字變量,在此宏中使用.bitno SETA 8 ;設(shè)置變量bitno值為8.MEND (3變量賦值偽指令:變量賦值偽指令用于對(duì)已定義的全局變量或局部變量賦值,共有3條變量賦值偽指令:SETA、SETL、SETS 。SETA偽指令用于給一個(gè)全局或局部的算術(shù)變量賦值。SETL偽指令用于給一個(gè)全局或局部的邏輯變量賦值。SETS偽指令用于給一個(gè)全局或局部的字符變量賦值。指令格式如下:Variable_
16、a SETA expr_aVariable_l SETL expr_lVariable_s SETS expr_s其中Variable_a、Variable_l、Variable_s就是前面全局變量或局部變量所定義的變量名。expr_a為賦值的常數(shù);expr_l為邏輯值,即TRUE或FALSE;expr_s為賦值的字符串。 例8 給字符串變量賦值。GBLS ErrStr ;先聲明字符串變量ErrStr .ErrStr SETS "No, Semaphone" ;給ErrStr變量賦值. 由前面分析得知,匯編語(yǔ)言的源程序是分段的,并且每個(gè)段都有自己的屬性,下面講述段定義和段屬
17、性定義偽指令。該類指令介紹如下:AREA:定義一個(gè)段開(kāi)始。END:整個(gè)文件結(jié)束。ALIGN:定義邊界對(duì)齊方式。ENTRY:定義程序入口。CODE16:指明本段為16位Thumb代碼。CODE32:指明本段為32位ARM代碼。例9 代碼段的例子。AREA Hello, CODE, READONLY ;聲明代碼段Hello, 只讀ENTRY ;定義程序入口CODE32 ;指明本段為32位ARM代碼Start MOV R7, #10MOV R6, #5ADD R6, R6, R7 ;R6 = R6 + R7B StartEND 例9中AREA偽指令定義了一個(gè)段,段名為Hello,段屬性是只讀的代碼段
18、。ENTRY偽指令用于指定程序的入口點(diǎn)。一個(gè)程序(可以包含多個(gè)源文件至少要有一個(gè)ENTRY,可以有多個(gè)ENTRY,但一個(gè)源文件中最多只有一個(gè)ENTRY。CODE32偽指令指示匯編編譯器后面的指令為32位的ARM指令。ARM9處理器支持兩種指令集:Thumb指令集和ARM指令集。其中CODE16偽指令指示匯編編譯器后面的指令為16位的Thumb指令,CODE32偽指令指示匯編編譯器后面的指令為32位的ARM指令。CODE16和CODE32偽指令只是指示匯編編譯器后面的指令的類型,偽指令本身并不進(jìn)行程序狀態(tài)切換。要用BX指令操作才能進(jìn)行切換。最后一條語(yǔ)句END偽指令用于告訴編譯器已經(jīng)到了源程序的結(jié)
19、尾。每一個(gè)匯編文件均要使用一個(gè)END偽指令指示本源程序結(jié)束。 下面介紹稍微復(fù)雜的AREA偽指令和ALIGN偽指令。(1AREA偽指令:AREA偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段。ARM 匯編程序設(shè)計(jì)采用分段式設(shè)計(jì),一個(gè)ARM源程序至少需要一個(gè)代碼段,而大的程序可以包含多個(gè)代碼段及數(shù)據(jù)段。偽指令格式如下:AREA sectionname , attr,attr.其中sectionname為所定義的代碼段或數(shù)據(jù)段的名稱。如果該名稱是以數(shù)據(jù)開(kāi)頭的,則該名稱必須用“|”括起來(lái)。attr為該代碼段或數(shù)據(jù)段的屬性。在AREA偽指令中,各屬性之間用逗號(hào)隔開(kāi),以下為段屬性及相關(guān)說(shuō)明: ALIGN=expr。默認(rèn)
20、的情況下,代碼段和數(shù)據(jù)段是4字節(jié)對(duì)齊的,expr可以取031的數(shù)值,相應(yīng)的對(duì)齊方式為2expr字節(jié)對(duì)齊。對(duì)于代碼段,expr不能為0或1。ASSOC=section。指定與本段相關(guān)的ELF段。任何時(shí)候鏈接section段也必須包括sectionname段。CODE為定義代碼段。屬性默認(rèn)為READONLY。DATA為定義數(shù)據(jù)段。屬性默認(rèn)為READWRITE。COMMON定義一個(gè)通用段。該段不包含任何用戶代碼和數(shù)據(jù)。鏈接器將其初始化為0。各源文件中同名的COMMON段共用同樣的內(nèi)存單元,鏈接器為其分配合適的尺寸。NOINIT指定本數(shù)據(jù)段僅僅保留了內(nèi)存單元,而沒(méi)有將各個(gè)初始值寫(xiě)入內(nèi)存單元,或者將內(nèi)存
21、單元值初始化為0。 READONLY指定本段為只讀,代碼段的默認(rèn)屬性為READONLY。READWRITE指定本段為可讀可寫(xiě),數(shù)據(jù)段的默認(rèn)屬性為READWRITE。使用AREA偽指令將程序分為多個(gè)ELF格式的段,段名稱可以相同,這時(shí)同名的段被放在同一個(gè)ELF段中。例10 聲明了代碼段Example1,只讀,并且4字節(jié)對(duì)齊。AREA Example1, CODE, READONLY, ALIGN = 2 (2ALIGN偽指令:ALIGN偽指令可通過(guò)添加填充字節(jié)的方式,使當(dāng)前位置滿足一定的對(duì)齊方式。偽指令格式如下:ALIGN 表達(dá)式, 偏移量其中,表達(dá)式的值用于指定對(duì)齊方式??赡艿娜≈禐?的冪,如
22、1、2、4、8、16等,不能為0。如果偽指令中沒(méi)有指定表達(dá)式,則編譯器會(huì)將當(dāng)前位置對(duì)齊到下一個(gè)字的位置。偏移量也為一個(gè)數(shù)字表達(dá)式,若使用該字段,則當(dāng)前位置的對(duì)齊方式為:2的表達(dá)式次方+偏移量。ALIGN=expr:對(duì)齊方式為2expr,如expr=3,則對(duì)齊方式為8字節(jié)對(duì)齊。表達(dá)式的取值范圍為031。 數(shù)據(jù)定義偽指令用于數(shù)據(jù)表定義、文字池定義、數(shù)據(jù)空間分配等,同時(shí)也可完成已分配存儲(chǔ)單元的初始化。該類偽指令有許多,這里只詳細(xì)介紹如下常用的偽指令,感興趣的可參考相關(guān)手冊(cè)。聲明一個(gè)文字池:LTORG。定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址:MAP。定義結(jié)構(gòu)化內(nèi)存表中的一個(gè)數(shù)據(jù)域:FIELD。分配一塊內(nèi)存空間
23、,并用0初始化:SPACE。分配一段字節(jié)的內(nèi)存單元,并用指定的數(shù)據(jù)初始化:DCB。分配一段半字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化:DCW。分配一段字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化: DCD。分配一段雙字的內(nèi)存單元,并用指定的數(shù)據(jù)初始化:DCQ。 (1LTORG:LTORG用于聲明一個(gè)文字池,在使用LDR偽指令時(shí),要在適當(dāng)?shù)牡刂芳尤隠TORG聲明文字池,這樣就會(huì)把要加載的數(shù)據(jù)保存到文字池內(nèi),再用ARM的加載指令讀出數(shù)據(jù)(如果沒(méi)有使用LTORG聲明文字池,則匯編器會(huì)在程序末尾自動(dòng)聲明。偽指令格式如下:LTORG例11 文字池舉例。LDR R0, =0xFFFF5678 ;LDR偽指令,裝載0xFF
24、FF5678給R0ADD R1, R1, R0MOV PC, LRLTORG ;聲明文字池,此地址存儲(chǔ)程序中用到的數(shù)據(jù)0xFFFF5678 . ;其他代碼 LTORG偽指令常放在無(wú)條件跳轉(zhuǎn)指令之后,或者子程序返回指令之后,這樣處理器就不會(huì)錯(cuò)誤地將文字池中的數(shù)據(jù)當(dāng)作指令來(lái)執(zhí)行。 (2MAP:MAP偽指令用于定義一個(gè)結(jié)構(gòu)化的內(nèi)存表的首地址。此時(shí)內(nèi)存表的位置計(jì)數(shù)器VAR設(shè)置為該地址值。VAR為匯編器的內(nèi)置變量。MAP也可用“”代替。偽指令格式如下:MAP expr , base_register其中,expr為程序中的標(biāo)號(hào)或數(shù)字表達(dá)式。base_register(基址寄存器為可選項(xiàng),當(dāng)base_re
25、gister 選項(xiàng)不存在時(shí),expr的值即為內(nèi)存表的首地址,當(dāng)該選項(xiàng)存在時(shí),內(nèi)存表的首地址為expr的值與base_register 的和。 例12 MAP指令。MAP 0x00, R9 ;定義內(nèi)存表的首地址為R9Timer FIELD 4 ;定義數(shù)據(jù)域Timer,長(zhǎng)度為4字節(jié)Attrib FIELD 4 ;定義數(shù)據(jù)域Attrib,長(zhǎng)度為4字節(jié)String FIELD 100 ;定義數(shù)據(jù)域String,長(zhǎng)度為100字節(jié).ADR R9, DataStart ;設(shè)置R9的值,即設(shè)置結(jié)構(gòu)化的內(nèi)存表地址 LDR R0, Attrib ;相當(dāng)于LDR, R0, R9, #4.MAP偽指令通常與FIELD
26、偽指令配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。但MAP、FIELD偽指令僅僅是定義數(shù)據(jù)結(jié)構(gòu),它們并不初始化內(nèi)存單元的內(nèi)容。MAP偽指令中的base_register寄存器的值對(duì)于其后所有的FIELD偽指令定義的數(shù)據(jù)域是默認(rèn)使用的,直到遇到新的包含base_register項(xiàng)的MAP偽指令。 (3FIELD:FIELD偽指令用于定義一個(gè)結(jié)構(gòu)化內(nèi)存表中的數(shù)據(jù)域。FIELD也可用“#”代替。偽指令格式如下:label FIELD expr其中l(wèi)abel為數(shù)據(jù)域標(biāo)號(hào),expr表示本數(shù)據(jù)域在內(nèi)存表中所占的字節(jié)數(shù)。FIELD偽指令常與MAP偽指令配合使用來(lái)定義結(jié)構(gòu)化的內(nèi)存表。MAP偽指令定義內(nèi)存表的首地址,FIEL
27、D偽指令定義內(nèi)存表中的各個(gè)數(shù)據(jù)域,并可以為每個(gè)數(shù)據(jù)域指定一個(gè)標(biāo)號(hào)供其他的指令引用。例13 MAP和FIELD偽指令的使用。 例13 MAP和FIELD偽指令的使用。MAP 0x40003000 ;定義內(nèi)存表的首地址為0x0x40003000 Count1 FIELD 4 ;定義數(shù)據(jù)域Count1,長(zhǎng)度為4字節(jié)Count2 FIELD 4 ;定義數(shù)據(jù)域Count2,長(zhǎng)度為4字節(jié)Count3 FIELD 4 ;定義數(shù)據(jù)域Count3,長(zhǎng)度為4字節(jié) .LDR R1, Count1 ;R1 0x0x40003000 + 0x00STR R1, Count2 ;R1 0x0x40003000 + 0x0
28、4 (4SPACE:SPACE用于分配一塊內(nèi)存單元,并用0初始化。%與SPACE同義。偽指令格式如下:label SPACE expr其中,label為內(nèi)存塊起始地址標(biāo)號(hào),expr為所要分配的內(nèi)存字節(jié)數(shù)。例14 為Buf變量申請(qǐng)空間。AREA DataRAM, DATA, READWRITE ;聲明數(shù)據(jù)段DataRAM Buf SPACE 1000 ;分配1000字節(jié)空間 (5DCB、DCW、DCD、DCQ:這4條偽指令都是用于分配一段內(nèi)存單元,并對(duì)該內(nèi)存單元初始化。唯一的區(qū)別是它們分配內(nèi)存單元的大小不同。這一類偽指令的格式是:label Mnemonic Operand, ., Operan
29、d其中標(biāo)號(hào)label字段是可有可無(wú)的,它表示分配的內(nèi)存起始地址,作用與指令語(yǔ)句前的標(biāo)號(hào)相同。Operand 為操作數(shù),即內(nèi)存單元的初始化數(shù)據(jù)。助記符(Mnemonic字段說(shuō)明所用偽指令的助記符,常用的有以下幾種:DCB分配一段字節(jié)的內(nèi)存單元,其后的每個(gè)操作數(shù)都占有一個(gè)字節(jié),操作數(shù)可以為-128255的數(shù)值或字符串。 DCW分配一段半字的內(nèi)存單元,其后的每個(gè)操作數(shù)都占有兩個(gè)字節(jié),操作數(shù)是16位二進(jìn)制數(shù),取值范圍為-3276865535。DCD分配一段字的內(nèi)存單元,其后的每個(gè)操作數(shù)都占有4個(gè)字節(jié),操作數(shù)可以是32位的數(shù)字表達(dá)式,也可以是程序中的標(biāo)號(hào)(因?yàn)槌绦蛑械臉?biāo)號(hào)代表地址,也是32位二進(jìn)制數(shù)值。
30、DCQ分配一段雙字的內(nèi)存單元,其后的每個(gè)操作數(shù)都占有8個(gè)字節(jié)。例15 分配內(nèi)存單元舉例(操作數(shù)可以是常數(shù),或者是表達(dá)式。 DATA_B DCB 10, 4, 0x33, 3*20 ;分配字節(jié)類型內(nèi)存單元DATA_W DCW 1000, 0x1000 ;分配半字類型內(nèi)存單元DATA_D DCD 0xFFFD00 ;分配字類型內(nèi)存單元匯編程序在匯編期間對(duì)存儲(chǔ)器進(jìn)行內(nèi)存分配,分配結(jié)果如圖4.1所示,其中Addr代表一個(gè)隨機(jī)分配的內(nèi)存地址。圖4.1中保存的數(shù)據(jù)都用十六進(jìn)制表示,其中DCB偽指令定義的每個(gè)數(shù)據(jù)占用一個(gè)字節(jié)空間,DCW 偽指令定義的每個(gè)數(shù)據(jù)占用兩個(gè)字節(jié)空間,DCD偽指令定義的每個(gè)數(shù)據(jù)占用4
31、個(gè)字節(jié)空間。 圖4.1 例15內(nèi)存分配示意圖十六進(jìn)制 數(shù)據(jù)表示DATA_D DATA_W DATA_BAddr+0Addr+1Addr+2Addr+3Addr+4Addr+6Addr+8Addr+C 例16 分配內(nèi)存單元舉例(操作數(shù)也可以是字符串。MESSAGE DCB "Hi, Monkey$" ;分配字節(jié)類型內(nèi)存單元例16的內(nèi)存分配結(jié)果如圖4.2所示,用了10個(gè)字節(jié)空間保存這個(gè)字符串,標(biāo)號(hào)MESSAGE指向該內(nèi)存塊的第一個(gè)地址。 圖4.2 例16內(nèi)存分配示意圖字符數(shù)據(jù)表示MESSAGE 低地址 Addr 高地址 Addr+9 例17 向量中斷表(操作數(shù)還可以是程序中的標(biāo)
32、號(hào)。 LDR PC, ResetAddrLDR PC, UndefineAddr.ResetAddr DCD Reset ;ResetAddr變量保存Reset 標(biāo)號(hào)的地址UndefineAddr DCD Undefined ;UndefineAddr變量保存Undefined標(biāo)號(hào)的地址 .Reset.Undefined. 匯編控制偽指令用于條件匯編、宏定義、重復(fù)匯編控制等。該類偽指令如下:宏定義:MACRO和MEND。條件匯編控制:IF,ELSE和ENDIF。重復(fù)匯編:WHILE和WEND。 (1宏定義偽指令MACRO和MEND:宏定義偽指令包括MACRO、MEND、MEXIT。MACRO定義一個(gè)宏語(yǔ)句段的開(kāi)始,MEND定義宏語(yǔ)句段的結(jié)束,MEXIT可以實(shí)現(xiàn)從宏程序段的跳出。用MACRO及MEND定義的一段代碼稱為宏定義體。在程序中就可以通過(guò)宏指令多次調(diào)用該代碼段。指令格式如下:MACRO$標(biāo)號(hào) 宏名$參數(shù) ;參數(shù)可以有多個(gè)語(yǔ)句段MEXIT語(yǔ)句段MEND 宏定義指令格式說(shuō)明如下:標(biāo)號(hào):是可選項(xiàng)。當(dāng)宏定義被展開(kāi)時(shí),可被替換成相應(yīng)的符號(hào),通常為一個(gè)標(biāo)號(hào),在一個(gè)符號(hào)前使用$表示被匯編時(shí)將使用相應(yīng)的值替代$后的符號(hào)。宏名:所定義的宏的名稱。宏調(diào)用是通過(guò)調(diào)用宏的名稱來(lái)實(shí)現(xiàn)的。參數(shù):宏指令的參數(shù)。當(dāng)宏指令被展開(kāi)時(shí)將被替換成相應(yīng)的值,類似
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 買賣交易合同(29篇)
- 2025年醫(yī)院人員勞動(dòng)合同格式
- 2025年中學(xué)食堂食材供應(yīng)合同模板
- 2025年雙方解除雇傭合同文件
- 2025年黏膜制劑材料項(xiàng)目提案報(bào)告模板
- 2025年兩層營(yíng)業(yè)店面租約合同樣本
- 2025年優(yōu)良種豬購(gòu)買合同范本
- 2025年合作協(xié)議撰寫(xiě)樣本
- 2025年度策劃專業(yè)外包服務(wù)協(xié)議范本
- 2025年交通設(shè)施安裝合同
- (正式版)JBT 14682-2024 多關(guān)節(jié)機(jī)器人用伺服電動(dòng)機(jī)技術(shù)規(guī)范
- 2024年職業(yè)衛(wèi)生技術(shù)人員評(píng)價(jià)方向考試題庫(kù)附答案
- 紅樓夢(mèng)詩(shī)詞全集
- 像科學(xué)家一樣思考-怎么做-怎么教-
- 苯胺合成靛紅工藝
- 三年級(jí)上冊(cè)數(shù)學(xué)脫式計(jì)算大全600題及答案
- 2024年度農(nóng)村電子商務(wù)ppt演示課件
- 計(jì)算機(jī)控制系統(tǒng) 課件 第10章 網(wǎng)絡(luò)化控制系統(tǒng)的分析與設(shè)計(jì)
- 高原反應(yīng)的癥狀和處理方法
- 南京大學(xué)儀器分析習(xí)題集
- 空調(diào)維保應(yīng)急預(yù)案
評(píng)論
0/150
提交評(píng)論