1)簡單的寄存器操作
典型的ARM數(shù)據(jù)處理指令的格式如下:
ADD R0,,R1,,R2 ;R0<-R1+R2
分好后面是注釋語句,應(yīng)該被匯編器忽略,。加入注釋語句使匯編代碼更加易讀和易解釋,。這個(gè)例子只是簡單地取2個(gè)寄存器值的和,,并將結(jié)果放在第2個(gè)寄存器。寄存器的值都是32位。
在編寫匯編語言源代碼時(shí),,必須注意操作數(shù)的正確順序,,第一個(gè)是結(jié)果寄存器,然后是第1操作數(shù),,最后是第2操作數(shù)(對于**操作,,第1和第2操作數(shù)都是寄存器,它們的次序并不重要),。當(dāng)這些指令執(zhí)行時(shí),,對系統(tǒng)而言,惟一的變化是目的寄存器R0的值,。當(dāng)然,,如果指定S,則CPSR中的標(biāo)志位N,、Z,、C和V的值也會有選擇的變化。
2)立即數(shù)操作
在數(shù)據(jù)處理指令中,,第2操作數(shù)除了可以是寄存器,,還可以是一個(gè)立即數(shù)。如果只有希望把一個(gè)常數(shù)加到寄存器,,而不是2個(gè)寄存器相加,,則可用立即數(shù)值取代第2操作數(shù)。例如,,立即數(shù)用前面加一個(gè)#的數(shù)值常量來表示:
ADD R3,,R3,#1 ,;R3<-R3+1
AND R8,,R7,#&FF ,;R8<-R7[7:0]
由第一個(gè)例子可以說明,,允許源和目的操作數(shù)使用同一個(gè)寄存器。第二個(gè)例子中,,&表示該立即數(shù)是十六位進(jìn)制的立即數(shù),。
雖然立即數(shù)的值是在32位指令字內(nèi)編碼,但不可能將所有可能的32為值作為有效立即數(shù),,有效立即數(shù)是由一個(gè)8位的立即數(shù)循環(huán)右移2n位得到,。匯編器也會用MVN代替MOV、用SUB代替ADD等,,這樣也可把立即數(shù)置于可設(shè)置的范圍之內(nèi),。
3)寄存器移位操作
在ARM數(shù)據(jù)處理指令中,第2操作數(shù)還有一種特有的形式——寄存器移位操作,即允許第2操作數(shù)在同第一操作數(shù)運(yùn)算之前完成移位操作,。例如:
ADD R3,,R2,R1,,LSL #3 ,;R<-R2+8*R1
注意,它是一條ARM指令,,在一個(gè)時(shí)鐘周期內(nèi)執(zhí)行,。許多處理器采用獨(dú)立的指令提供移位操作,但ARM將它們和基本的ALU操作合并在一個(gè)指令中,。
例子中,,在R1和R2相加之前,先將R1邏輯左移3位,,然后再與R2相加,,在這里用立即數(shù)#3表示移位的位數(shù)??傻玫降囊莆徊僮饔蠰SL,、LSR、ASL,、ROR和RRX,,這些移位操作與移位尋址中的移位操作時(shí)相同的。
第2操作數(shù)的移位位數(shù)除了可用立即數(shù)定義外,,還可使用寄存器值定義,。例如:
ADD R5,R5,,R3,,LSL R2 ;R5<-R5+R3*2的R2次冪
這是4地址指令,。只有R2的低8位是有意義的,,但由于移位超過32位不是非常有用,所以這種限制對于許多用途是不重要的,。