新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > ARM匯編編程基礎(chǔ)之六-其它尋址模式與其它指令

ARM匯編編程基礎(chǔ)之六-其它尋址模式與其它指令

作者: 時(shí)間:2016-11-27 來源:網(wǎng)絡(luò) 收藏

STMED、STMEA、STMFD、STMFA和LDMED、LDMEA、LDMFD、LDMFA就是所謂的堆棧尋址指令。由此可見:為了對(duì)程序員體貼入微,ARM指令集的設(shè)計(jì)者設(shè)計(jì)了堆棧尋址指令,其實(shí)質(zhì)就是多寄存尋址指令的快捷方式。

4、寄存器移位尋址

寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個(gè)操作數(shù)是寄存器移位方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。例如:

MOV R0,R2,LSL #3 表示將R2的值邏輯左移3位,結(jié)果放入R0,即是R0=R2×8。

移位的方式有以下幾種:

LSL(logic shift left):邏輯左移

LSR(logic shift right):邏輯右移

ASR(arithmetic shift right):算術(shù)右移

ROR(rotate shift right):循環(huán)右移

RRX(rotate shift right with extend):帶擴(kuò)展的循環(huán)右移。其中的C指的是CPSR的C位

5、相對(duì)尋址

相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。例如:

BLOOP
...
LOOPMOVR6,#1

該條B指令的意思是要跳轉(zhuǎn)到標(biāo)號(hào)LOOP所代表的指令處,其含義相當(dāng)明顯,但你要明白CPU根本不明白標(biāo)號(hào)是個(gè)什么東西(事實(shí)上在指令的機(jī)器碼中根本就沒有標(biāo)號(hào)這種東西),那么b loop這條指令的機(jī)器碼會(huì)是什么呢?答案是:高8bit是操作碼相關(guān)內(nèi)容,低24bit是一個(gè)常數(shù),表示從b指令到mov指令之間的內(nèi)存地址的差值(如果不考慮流水線的影響的話)。由此可見,b loop這條指令相當(dāng)于add pc, pc, #偏移量常數(shù),典型的相對(duì)于PC(當(dāng)前指令地址)的相對(duì)尋址。由于是相對(duì)于當(dāng)前指令地址進(jìn)行相對(duì)尋址,所以無論程序最終運(yùn)行在內(nèi)存的何處(即使運(yùn)行的地址不是它預(yù)期的位置),這條B指令都能正確運(yùn)行。關(guān)于相對(duì)尋址、程序期望的運(yùn)行地址等等,我將在“ARM匯編偽指令”一文中詳細(xì)描述。

隨便說一下,前面學(xué)到b指令的跳轉(zhuǎn)范圍是當(dāng)前指令的先后32M,為什么是這個(gè)范圍呢?因?yàn)?4bit常數(shù)用1個(gè)比特區(qū)別正負(fù),還剩23bit,同時(shí)由于ARM指令在內(nèi)存中的地址其最低2bit一定是0(為什么?請(qǐng)自行思考一下),因此23bit中可以不必表示這2個(gè)0,所以23bit可以表示的范圍是0 ---- 2^25,即:0 ---- 32M。

我們?cè)?ldquo;基本尋址模式與基本指令”一文中學(xué)習(xí)了最常用的指令。下面介紹其它較為常用的指令。

1、訪存指令

LDRH(半字加載);LDRSH (有符號(hào)半字加載);STRH(半字存儲(chǔ))

交換指令

助記符

說明

操作

SWP Rd,Rm,[Rn]

寄存器和存儲(chǔ)器字?jǐn)?shù)據(jù)交換

Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

SWPB Rd,Rm,[Rn]

寄存器和存儲(chǔ)器字節(jié)數(shù)據(jù)交換

Rd←[Rn],[Rn]←Rm (Rn≠Rd或Rm)

2、數(shù)據(jù)處理指令

助記符

說明

操作

MVN Rd,operand2

數(shù)據(jù)非傳送

Rd←(~operand2)

助記符

說明

操作

RSB Rd, Rn, operand2

逆向減法指令

Rd←operand2-Rn

ADC Rd, Rn, operand2

帶進(jìn)位加法

Rd←Rn+operand2+Carry

SBC Rd, Rn, operand2

帶進(jìn)位減法指令

Rd←Rn-operand2-(NOT)Carry

RSC Rd, Rn, operand2

帶進(jìn)位逆向減法指令

Rd←operand2-Rn-(NOT)Carry

這里要特別提到,ADC指令結(jié)合CPSR,可以實(shí)現(xiàn)64位整數(shù)加法,詳情參見“雜項(xiàng)解釋”一文

助記符

說明

操作

BIC Rd, Rn, operand2

按位清除指令

Rd←Rn & (~operand2)

其實(shí)現(xiàn)功能是:將Rn中對(duì)應(yīng)于operand2中為1的bit位全部清0,然后將結(jié)果保存到Rd中

助記符

說明

操作

CMN Rn, operand2

負(fù)數(shù)比較指令

標(biāo)志N、Z、C、V←Rn+operand2

TST Rn, operand2

位測(cè)試指令

標(biāo)志N、Z、C←Rn & operand2

TEQ Rn, operand2

相等測(cè)試指令

標(biāo)志N、Z、C←Rn ^ operand2

TST指令測(cè)試的是:Rn中所有指定bit位是否全為0(指定的bit位是operand2中為1的所有位);

TEQ指令測(cè)試的是:Rn和operand2是否相等。這點(diǎn)上與CMP指令一樣,區(qū)別在于CMP指令除了可以比較2個(gè)數(shù)是否相等外,也可以比較2個(gè)數(shù)誰大誰小,但TEQ不行。

3、乘法指令

助記符

說明

操作

MUL Rd,Rm,Rs

32位乘法指令

Rd←Rm*Rs (Rd≠Rm)

MLA Rd,Rm,Rs,Rn

32位乘加指令

Rd←Rm*Rs+Rn (Rd≠Rm)

UMULL RdLo,RdHi,Rm,Rs

64位無符號(hào)乘法指令

(RdLo,RdHi) ←Rm*Rs

UMLAL RdLo,RdHi,Rm,Rs

64位無符號(hào)乘加指令

(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)

SMULL RdLo,RdHi,Rm,Rs

64位有符號(hào)乘法指令

(RdLo,RdHi) ←Rm*Rs

SMLAL RdLo,RdHi,Rm,Rs

64位有符號(hào)乘加指令

(RdLo,RdHi) ←Rm*Rs+(RdLo,RdHi)

4、協(xié)處理器指令

參見“MMU與內(nèi)存保護(hù)的實(shí)現(xiàn)”一文

5、雜項(xiàng)指令

SWI:軟中斷指令,參見“swi與system call的實(shí)現(xiàn)”一文

MRS、MSR:程序狀態(tài)寄存器操作指令,參見“ARM異常處理”一文


上一頁 1 2 下一頁

關(guān)鍵詞: ARM匯編編程尋址模

評(píng)論


技術(shù)專區(qū)

關(guān)閉