ARM匯編程序設(shè)計(jì)之:匯編語言文件格式
3.浮點(diǎn)數(shù)字量表達(dá)式
浮點(diǎn)數(shù)字量有以下幾種形式。
·{-}digitsE{-}digits。
·{-}{digits}.digits{E{-}digits}。
·0xhexdigits。
·hexdigits。
其中,digits為十進(jìn)制數(shù),要在其后加上字母E(大寫或小寫)來表示其指數(shù);hexdigits為十六進(jìn)制數(shù)。
單精度浮點(diǎn)數(shù)的表示范圍為1.17549435e−38~3.40282347e+38;雙精度浮點(diǎn)數(shù)的表示范圍為2.22507385850720138e-308~1.79769313486231571e+308。
下面的例子說明了浮點(diǎn)數(shù)據(jù)量的基本用法。
DCFD1E308,-4E-100
DCFS1.0
DCFD3.725e15
LDFS0x7FC00000;
LDFDFFF0000000000000;
4.邏輯表達(dá)式
邏輯表達(dá)式一般由邏輯量、邏輯運(yùn)算符和括號構(gòu)成,其表達(dá)式的運(yùn)算結(jié)果為真或假。與邏輯表達(dá)式相關(guān)的運(yùn)算符有“=”、“>”、“”、“>=”、“=”、“/=”、“>”運(yùn)算符和“LAND”、“LOR”、“LNOT”及“LEOR”運(yùn)算符。
5.程序或寄存器相關(guān)表達(dá)式
寄存器相關(guān)表達(dá)式的值等于指定寄存器的值加上或減去一個(gè)數(shù)字表達(dá)式。
程序相關(guān)表達(dá)式的值等于程序計(jì)數(shù)器PC的值加上或減去一個(gè)數(shù)字表達(dá)式的值。此種表達(dá)式通常由程序中的標(biāo)號與一個(gè)數(shù)字表達(dá)式組成。
下面的例子說明了程序或寄存器相關(guān)表達(dá)式的基本使用方法。
LDRr4,=data+4*n ;n是匯編時(shí)取值變量
;code
MOVpc,lr
dataDCDvalue0
;n-1個(gè)DCD偽操作
DCDvaluen ;data+4*n指向此
;更多DCD偽操作
6.匯編中的操作符
(1)操作符的優(yōu)先級
在匯編語言程序設(shè)計(jì)中,表達(dá)式包含一個(gè)擴(kuò)展的操作符集,這些操作符和高級語言中的運(yùn)算符十分接近。其運(yùn)算次序遵循如下的優(yōu)先級。
①優(yōu)先級相同的雙目運(yùn)算符的運(yùn)算順序?yàn)閺淖蟮接摇?/p>
②相鄰的單目運(yùn)算符的運(yùn)算順序?yàn)閺挠业阶?,單目運(yùn)算符的優(yōu)先級高于其他運(yùn)算符。
③括號運(yùn)算符的優(yōu)先級最高。
匯編語法的操作符優(yōu)先級和C語言中的不完全相同。例如在匯編中,下面的匯編語言
(1+2∶SHR∶3)相當(dāng)于(1+(2∶SHR∶3)),而在C語言中,運(yùn)算則變?yōu)椋ǎ?+2)>>3)=0。類似于這樣的操作,在使用時(shí)要特別注意。
注意 | 為了保證表達(dá)式運(yùn)算結(jié)果的正確,建議使用“()”來避免異義。 |
表10.4列出了匯編操作符的優(yōu)先級以及對應(yīng)的C語言運(yùn)算符。
表10.4 匯編操作符優(yōu)先級
匯編操作符 | C語言運(yùn)算符 |
單目運(yùn)算 | 單目運(yùn)算 |
*/:MOD: | */% |
字符串操作 | n/a |
:SHL::SHR::ROR::ROL: | >> |
+-:AND::OR::EOR: | +-$| |
=>>==/=> | ==>>==!= |
:LAND::LOR::LEOR: | || |
說明 | 表10.3是按操作符的優(yōu)先級從上到下排列的。 |
C語言運(yùn)算符優(yōu)先級從高到低排列如下。
·單目運(yùn)算
·*/%
·+-(asbinaryoperators)
·>>
·=>>=
·==!=
·
·^
·|
·
·||
(2)單目運(yùn)算
最高優(yōu)先級的單目運(yùn)算在表達(dá)式中最先被計(jì)算。單目操作符寫在操作數(shù)的前面。運(yùn)算順序?yàn)閺挠业阶蟆?/p>
表10.5列出了匯編中單目運(yùn)算操作符及其返回值。
表10.5 匯編中單目運(yùn)算操作符及其返回值。
操作符 | 使用 | 描述 |
:CHR: | :CHR:A | 返回字母A的ASCII碼 |
:LOWERCASE | :LOWERCASE:string | 將給定字符串中的所有大寫字母變成小寫 |
REVERSE_CC | :REVERSE_CC:cond_code | 對條件碼取反 |
:STR: | :STR:A | 將一個(gè)數(shù)字量或邏輯表達(dá)式轉(zhuǎn)換成串 |
:UPPERCASE: | :UPPERCASE:string | 將給定字符串中的所有小寫字母變成大寫 |
? | ?A | 返回定義符號A的代碼行所生產(chǎn)代碼行的字節(jié)數(shù) |
續(xù)表
操作符 | 使用 | 描述 |
+和- | +A和-A | 單目加和單目減,操作數(shù)為數(shù)學(xué)或程序相關(guān)表達(dá)式 |
:BASE: | :BASE:A | 如果A是程序或寄存器相關(guān)表達(dá)式,:BASE:返回基址寄存器的編號 |
:CC_ENCODING: | :CC_ENCODING:cond_code | 返回條件碼中的數(shù)字值 |
:DEF: | :DEF:A | 判斷A是否被定義,如果被定義返回{TRUE};如果沒有定義返回{FALSE} |
:INDEX: | :INDEX:A | 如果A是寄存器相關(guān)表達(dá)式,:INDEX:返回A相對于寄存器的偏移量,常用在宏操作中 |
:LEN: | :LEN:A | 字符串A的長 |
:LNOT: | :LNOT:A | 邏輯表達(dá)式A的值取反 |
:NOT: | :NOT:A ~A | A的值按位取反 |
:RCONT: | :RCONT:Rn | 返回寄存器編號,0~15對應(yīng)寄存器r0~r15 |
評論