日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式教程
[導(dǎo)讀]在ARM匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒有相對(duì)應(yīng)的操作碼,通常稱這些特殊指令助記符為偽操作標(biāo)識(shí)符(directive),它們所完成的操作稱為偽操作。偽操作在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,這些偽操作僅在匯編過程中起作用,一旦匯編結(jié)束,偽操作的使命就完成。

ARM源程序文件(即源文件)有特定的文件格式和語法規(guī)則,可以使用任意文本編輯器編寫程序代碼。一般地,ARM源程序文件名的后綴如表10.1所示。

表10.1 ARM源程序文件名后綴

程序

文件名

匯編

*.S

引入文件

*.INC

C程序

*.C

頭文件

*.H

在一個(gè)項(xiàng)目中,至少要有一個(gè)匯編源文件,可以有多個(gè)匯編源文件或多個(gè)C程序,或者C程序文件和匯編文件兩者的組合。

ARM匯編語言語句格式如下所示。

{label}{instruction/directive/pseudo-instruction}{;comment}

注意

所有指令均不能頂格寫,要用空格(space)或TAB開頭。

其中instruction即ARM指令集中的匯編指令。Directive為ARM匯編器所支持的偽操作。pseudo-instruction為ARM匯編器所支持的偽操作。下面章節(jié)分別介紹偽操作和偽指令。

10.1ARM匯編器所支持的偽操作

在ARM匯編語言程序里,有一些特殊指令助記符,這些助記符與指令系統(tǒng)的助記符不同,沒有相對(duì)應(yīng)的操作碼,通常稱這些特殊指令助記符為偽操作標(biāo)識(shí)符(directive),它們所完成的操作稱為偽操作。偽操作在源程序中的作用是為完成匯編程序作各種準(zhǔn)備工作的,這些偽操作僅在匯編過程中起作用,一旦匯編結(jié)束,偽操作的使命就完成。

在ARM的匯編程序中,偽操作主要有符號(hào)定義偽操作、數(shù)據(jù)定義偽操作、匯編控制偽操作、宏指令等。

10.1.1符號(hào)定義(SymbolDefinition)偽操作

符號(hào)定義偽操作用于定義ARM匯編程序中的變量、對(duì)變量賦值以及定義寄存器的別名等操作。常見的符號(hào)定義偽操作有如下幾種。

·用于定義全局變量的GBLA、GBLL和GBLS。

·用于定義局部變量的LCLA、LCLL和LCLS。

·用于對(duì)變量賦值的SETA、SETL、SETS。

·為通用寄存器列表定義名稱的RLIST。

·為協(xié)處理器寄存器定義別名的CN。

·為協(xié)處理器定義別名的CP。

·為VFP寄存器定義名稱的DN和SN。

·為FPA浮點(diǎn)指針寄存器定義名稱的FPA。

1.全局變量定義偽操作GBLA、GBLL和GBLS

(1)語法格式

GBLA、GBLL和GBLS偽操作用于定義一個(gè)ARM程序中的全局變量并將其初始化。其中:

GBLA偽操作用于定義一個(gè)全局的數(shù)字變量并初始化為0。

GBLL偽操作用于定義一個(gè)全局的邏輯變量并初始化為F(假)。

GBLS偽操作用于定義一個(gè)全局的字符串變量并初始化為空。

由于以上3條偽指令用于定義全局變量,因此在整個(gè)程序范圍內(nèi)變量名必須惟一。

語法格式如下。

<gblx><variable>

①<gblx>

取值為GBLA、GBLL、GBLS之一。

②<variable>

定義的全局變量名,在其作用范圍內(nèi)必須惟一。全局變量的作用范圍為包含該變量的源程序。

(2)使用說明

如果用這些偽操作重新聲明已經(jīng)聲明過的變量,變量的值將被初始化成后一次聲明語句中的值。

(3)示例

①使用偽操作聲明全局變量。

GBLATest1 ;定義一個(gè)全局的數(shù)字變量,變量名為Test1

Test1SETA0xaa ;將該變量賦值為0xaa

GBLLTest2 ;定義一個(gè)全局的邏輯變量,變量名為Test2

Test2SETL{TRUE} ;將該變量賦值為真

GBLSTest3 ;定義一個(gè)全局的字符串變量,變量名為Test3

Test3SETS"Testing" ;將該變量賦值為“Testing”

②聲明變量objectsize并設(shè)置其值為0xff,為“SPACE”操作做準(zhǔn)備。

GBLAobjectsize

ObjectsizeSETAoxff

SPACEobjectsize

③下面的例子顯示如何使用匯編命令設(shè)置變量的值。具體做法是使用“-pd”選項(xiàng)。

Armasm-pd"objectsizeSETAoxff"-oobjectfilesourcefile

2.局部變量定義偽操作LCLA、LCLL和LCLS

(1)語法格式

LCLA、LCLL和LCLS偽指令用于定義一個(gè)ARM程序中的局部變量并將其初始化。其中:

LCLA偽操作用于定義一個(gè)局部的數(shù)字變量并初始化為0。

LCLL偽操作用于定義一個(gè)局部的邏輯變量并初始化為F(假)。

LCLS偽操作用于定義一個(gè)局部的字符串變量并初始化為空。

以上三條偽操作用于聲明局部變量,在其作用范圍內(nèi)變量名必須惟一。

語法格式如下。

<lclx><variable>

①<gblx>

取值為LCLA、LCLL、LCLS之一。

②<variable>

所定義的局部變量名,在其作用范圍內(nèi)必須惟一。局部變量作用范圍為包含該局部變量的宏。

(2)使用說明

如果用這些偽操作重新聲明已經(jīng)聲明過的變量,則變量的值將被初始化成后一次聲明語句中的值。

(3)示例

①使用偽操作聲明局部變量。

LCLATest4 ;聲明一個(gè)局部的數(shù)字變量,變量名為Test4

Test3SETA0xaa ;將該變量賦值為0xaa

LCLLTest5 ;聲明一個(gè)局部的邏輯變量,變量名為Test5

Test4SETL{TRUE} ;將該變量賦值為真

LCLSTest6 ;定義一個(gè)局部的字符串變量,變量名為Test6

Test6SETS"Testing" ;將該變量賦值為“Testing”

②下面的例子定義一個(gè)宏,顯示了局部變量的作用范圍。

MACRO ;聲明一個(gè)宏

$labelmessage$a ;宏原型

LCLSerr ;聲明局部字符串變量

$label

INFO0,"err":CC::STR:$a

MEND ;宏結(jié)束,局部變量不再起作用

3.變量賦值偽操作SETA、SETL和SETS

(1)語法格式

偽指令SETA、SETL和SETS用于給一個(gè)已經(jīng)定義的全局變量或局部變量賦值。

SETA偽操作用于給一個(gè)數(shù)學(xué)變量賦值;

SETL偽操作用于給一個(gè)邏輯變量賦值;

SETS偽操作用于給一個(gè)字符串變量賦值;

語法格式如下。

Variable<setx>expr

①Variable

變量名為已經(jīng)定義過的全局變量或局部變量,表達(dá)式為將要賦給變量的值。

②<setx>

取值為SETA、SETL、SETS之一。

③expr

數(shù)學(xué)、邏輯或字符串表達(dá)式,也就是將要賦予變量的值。

(2)使用說明

在向變量賦值前必須先聲明變量。

也可以在匯編指令中預(yù)定義變量,如:

"Armasm--pd"objectsizeSETAoxff"--oobjectfilesourcefile"

(3)示例

①為預(yù)先定義的變量賦值。

LCLATest3 ;聲明一個(gè)局部的數(shù)字變量,變量名為Test3

Test3SETA0xaa ;將該變量賦值為0xaa

LCLLTest4 ;聲明一個(gè)局部的邏輯變量,變量名為Test4

Test4SETL{TRUE} ;將該變量賦值為真

LCLSTest6 ;定義一個(gè)局部的字符串變量,變量名為Test6

Test6SETS"Testing" ;將該變量賦值為“Testing”

②使用變量賦值偽操作,定義一些程序相關(guān)內(nèi)容。

GBLAversionNumber

VersionNumber SETA21

GBLLDebug

Debug SETL{TRUE}

GBLS versionString

VersionString SETS"version1.0"

4.通用寄存器列表定義偽操作RLIST

(1)語法格式

RLIST偽操作可用于對(duì)一個(gè)通用寄存器列表定義名稱,使用該偽操作定義的名稱可在ARM指令LDM/STM中使用。在LDM/STM指令中,列表中的寄存器訪問次序根據(jù)寄存器的編號(hào)由低到高,與列表中的寄存器排列次序無關(guān)。

語法格式如下。

NameRLIST{list-of-registers}

①Name

寄存器列表的名稱。

注意

該名稱不能和已經(jīng)定義寄存器或協(xié)處理器名稱相同。

②list-of-registers

通用寄存器列表。列表中的寄存器用“,”隔開,如果是編號(hào)連續(xù)的通用寄存器可以用“-”指定寄存器范圍。具體用法參見程序示例。

(2)使用說明

在使用ARM匯編編譯器編譯源文件時(shí),可以使用“-checkreg”選項(xiàng)來指定匯編器進(jìn)行寄存器檢查。如果匯編器檢測(cè)到寄存器列表中的寄存器編號(hào)非升序排列,將給出編譯警告。

(3)示例

①將寄存器列表名稱定義為RegList,可在ARM指令LDM/STM中通過該名稱訪問寄存器列表。

RegListRLIST{R0-R5,R8,R10};

②使用“-”在寄存器列表中,指定寄存器范圍。

ContextRLIST{r0-r6,r8,r10-r12,r15} ;

5.協(xié)處理器寄存器名稱定義偽操作CN

(1)語法格式

CN偽操作為協(xié)處理器寄存器定義名稱。

語法格式如下。

NameCNexpr

①Name

定義的協(xié)處理器寄存器的名稱。

注意

該名稱不能和已經(jīng)定義寄存器或協(xié)處理器名稱相同。

②expr

協(xié)處理器寄存器編號(hào)。

(2)使用說明

協(xié)處理器寄存器編號(hào)的數(shù)值范圍為0~15。避免使用不同的名稱定義同一物理寄存器。

注意

協(xié)處理器寄存器的名稱不能被定義為c0~c15,這些名稱已經(jīng)被匯編器預(yù)定義。

(3)示例

將協(xié)處理器寄存器6命名為Power。

PowerCN6

6.協(xié)處理器名稱定義偽操作CP

(1)語法格式

CP偽操作為指定的協(xié)處理器定義名稱。

語法格式如下。

NameCPexpr

①Name

定義的協(xié)處理器名稱。

注意

該名稱不能和已經(jīng)定義寄存器或其他協(xié)處理器名稱相同。

②expr

協(xié)處理器編號(hào)。

(2)使用說明

協(xié)處理器編號(hào)范圍為0~15。

使用CP偽操作為協(xié)處理器定義一個(gè)方便記憶的名稱,可以使程序員更高效地編寫代碼。

注意

協(xié)處理器寄存器的稱不能被定義為p0~p15,這些名稱已經(jīng)被匯編器預(yù)定義。

(3)示例

將協(xié)處理器6命名為Dmu。

DmuCP6

7.VFP寄存器名稱定義偽操作DN/SN

(1)語法格式

DN偽操作為雙精度(double-precision)VFP寄存器定義名稱。D0~D15是匯編器預(yù)先定義的,用戶不能使用。

SN偽操作為單精度(single-precision)VFP寄存器定義名稱。S0~S31是匯編器預(yù)先定義的,用戶不能使用。

語法格式如下。

NameDNexpr

NameSNexpr

①Name

指定的VFP寄存器的名稱。

注意

該名稱不能和已經(jīng)定義寄存器或其他協(xié)處理器名稱相同。

②expr

指定VFP寄存器編號(hào)。對(duì)于雙精度寄存器編號(hào)范圍為0~15;對(duì)于單精度寄存器編號(hào)范圍為0~31。

(2)示例

①將VFP雙精度寄存器6定義為energy。

energyDN6

②將VFP單精度寄存器16定義為mass。

massSN16

8.浮點(diǎn)寄存器名稱定義偽操作FN

(1)語法格式

FN為一個(gè)FPA浮點(diǎn)寄存器定義名稱。F0~F7是匯編器預(yù)先定義的,用戶不能使用。

注意

FPA的使用在ARM公司新發(fā)布的編譯器RVCT中已不再支持。

語法格式如下。

NameFNexpr

①Name

指定的浮點(diǎn)寄存器的名稱。

注意

該名稱不能和已經(jīng)定義寄存器或其他協(xié)處理器名稱相同。

②expr

指定浮點(diǎn)寄存器編號(hào)。編號(hào)范圍為0~7。

(2)示例

為浮點(diǎn)寄存器6指定名稱為Energy。

EnergyFN6

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉