ARM學(xué)習(xí)路線02-ARM指令集、尋址方式

第二部分 ARM指令集翩迈、尋址方式

1. ARM指令集

ARM指令集大致可分為一下6大類:跳轉(zhuǎn)指令持灰、數(shù)據(jù)處理指令、程序狀態(tài)寄存器指令负饲、Load/Store指令堤魁、協(xié)處理器指令和中斷指令等。

ARM指令字長(zhǎng)為固定的32位返十。一條典型的ARM指令編碼格式如下:
指令編碼格式

一條典型的ARM指令語法格式如下所示:
指令語法格式
1. 數(shù)據(jù)處理指令

? ? ? ? 數(shù)據(jù)處理指令又可細(xì)分為移動(dòng)指令妥泉、算術(shù)指令、邏輯運(yùn)算指令洞坑、比較運(yùn)算指令和乘法指令盲链。

1.1 移動(dòng)指令

最簡(jiǎn)單的ARM指令,如:

mov r9, sp
mov r1 #0
1.2 移位器

共有5中移位操作:邏輯左移LSL迟杂、邏輯右移LSR刽沾、算術(shù)右移ASR、循環(huán)右移ROR和擴(kuò)展的循環(huán)右移RRX排拷。
如:r1 = r1<<9

mov r1, r1, LSL #9
1.3 算術(shù)指令

32位有符號(hào)數(shù)和無符號(hào)數(shù)的加減法侧漓,常用算術(shù)指令有:

ADC 帶進(jìn)位的加法 Rd = Rn + N + carry
ADD 加法 Rd = Rn + N
RSB 反向減法 Rd = N - Rn
RSC 帶借位的反向減法 Rd = N - Rn - !(carry flag)
SBC 帶借位的減法 Rd = Rn - N - !(carry flag)
SUB 減法 Rd = Rn - N

如:S_FRAME_SIZE是72,r0 = sp + 72
r0 = r1 + (r1<<2)

add r0, sp, #S_FRAME_SIZE
add r0, r1, r1, LSL #2
1.4 邏輯運(yùn)算指令
AND Rd = Rn & N
ORR Rd = Rn | N
EOR 異或 Rd = Rn ^ N
BIC 清位 Rd = Rn & ~N

如:

and r1, r0, #0x1f
1.5 比較指令

常見比較指令有:

CMN 否定比較 Rn + N
CMP 比較 Rn - N
TEQ 測(cè)試兩個(gè)32位數(shù)是否相等 Rn ^ N
TST 測(cè)試一個(gè)32位數(shù)的位 Rn & N

如:比較r1是否等于0x1a监氢,并設(shè)定cpsr中的標(biāo)志位布蔗,這樣后面的指令可以根據(jù)標(biāo)志位條件執(zhí)行。

teq r1, 0x1a
1.6 乘法指令

常見乘法指令有:

MLA 乘法和累加 Rd = Rm * Rs + Rn
MUL 乘法 Rd = Rm * Rs

如:r3 = r4 * r1 + r3

mla r3, r4, r1, r3
2. 跳轉(zhuǎn)指令

? ? ? ? 改變程序執(zhí)行流程或者用于調(diào)用子程序忙菠,強(qiáng)制程序計(jì)數(shù)器PC指向一個(gè)新地址何鸡。常用的跳轉(zhuǎn)指令有:

B 跳轉(zhuǎn)
BL 帶返回的跳轉(zhuǎn)
BX 跳轉(zhuǎn)并切換狀態(tài)
BLX 帶返回的跳轉(zhuǎn)并切換狀態(tài)

如:

bl cpu_init_cp15
3. 軟中斷指令

常用的軟中斷指令如下:

SWI 軟中斷
4. 程序狀態(tài)寄存器指令

常用程序狀態(tài)寄存器指令如下:

MRS 復(fù)制程序狀態(tài)寄存器到通用寄存器中 Rd = psr
MSR 將通用寄存器的值傳到程序狀態(tài)寄存器中 psr[field] = Rm
MSR 將立即數(shù)的值傳到程序狀態(tài)寄存器中 psr[field] = 立即數(shù)
5. 協(xié)處理器指令

協(xié)處理器是指令集的擴(kuò)展,協(xié)處理器既可以提供額外的計(jì)算能力牛欢,也用于包括Cache和存儲(chǔ)管理在內(nèi)的存儲(chǔ)系統(tǒng)骡男。協(xié)處理器指令包括數(shù)據(jù)處理、寄存器傳輸和內(nèi)存?zhèn)鬏斨噶睢?br> 常用協(xié)處理器指令如下:

CDP 協(xié)處理器數(shù)據(jù)傳輸——在協(xié)處理器中執(zhí)行一個(gè)操作
MRC|MCR 協(xié)處理器寄存器傳輸——從協(xié)處理器中移出數(shù)據(jù)或者移入數(shù)據(jù)
LDC STC 協(xié)處理器內(nèi)存?zhèn)鬏敗獜膮f(xié)處理器中l(wèi)oad/store內(nèi)存
5. 偽指令

加載常量的偽指令如下:

LDR 加載常量的偽指令 Rd = 32位的常量
ADR 加載地址的偽指令 Rd = 32位的相對(duì)地址

如:

adr lr, here

2. ARM尋址方式

? ? ? ? 尋址方式是指處理器根據(jù)指令中給出的地址信息來尋找物理地址的方式傍睹,目前ARM指令系統(tǒng)支持以下幾種尋址方式:

2.1 立即尋址

也稱為立即數(shù)尋址隔盛,這種尋址方式指令中就已經(jīng)給出了操作數(shù)。也就是在執(zhí)行指令的過程中拾稳,處理器取得指令的同時(shí)也取得了操作數(shù)吮炕,因此稱為立即數(shù)尋址。例如:

ADD  R0, #1                 @R0+1->R0
ADD  R0, R0, #0x3F          @R0+0x3F->R0

在上面兩條指令中访得,源操作數(shù)就是立即數(shù)龙亲,要求以“#”開始陕凹,對(duì)于十六進(jìn)制的立即數(shù),要求在“#”后面加“0x”或“&”鳄炉。

2.2 寄存器尋址

即將寄存器中的數(shù)值作為操作數(shù)杜耙,是各類微處理器常用的尋址方式,也是效率較高的尋址方式拂盯。例如:

ADD  R0, R1, R2           @ R1+R2->R0

該指令的執(zhí)行效果是將R1和R2的值相加佑女,將結(jié)果存入R0

2.3 寄存器間接尋址

寄存器間接尋址是以寄存器中的值作為操作數(shù)的地址,操作數(shù)本身存放在寄存器中谈竿。例如:

ADD  R0, R1, [R2]           @ R1+[R2]->R0
LDR   R0, [R1]              @ [R1]->R0

第一條指令团驱,以寄存器R2的值作為操作數(shù)的地址,在寄存器中取得一個(gè)操作數(shù)后與R1相加空凸,將結(jié)果存入寄存器R0嚎花。第二條指令,將寄存器中以R1為地址的值賦給R0劫恒。

2.4 基址變址尋址

基址變址尋址是把基址寄存器的內(nèi)容與指令中給出的地址偏移量相加贩幻,從而得到一個(gè)操作數(shù)的有效地址。該方式常用于訪問基地址附近的某些存儲(chǔ)單元两嘴,一般有以下幾種方式:

LDR   R0, [R1, #4]        @ [R1+4]->R0

第一條指令,將寄存器R1的值加上4作為操作數(shù)的有效地址族壳,取得操作數(shù)后存入R0中憔辫。

LDR   R0, [R1, #4]!       @ [R1+4]->R0、R1+4->R1

第二條指令仿荆,將寄存器R1的值加上4作為操作數(shù)的有效地址贰您,取得操作數(shù)后存入R0中,然后寄存器R1的值加上4個(gè)字節(jié)拢操。

LDR   R0, [R1]锦亦, #4      @ [R1]->R0、R1+4->R1

第三條指令令境,將寄存器R1的值作為操作數(shù)的有效地址杠园,取得操作數(shù)后存入R0中,然后寄存器R1的值加上4個(gè)字節(jié)舔庶。

LDR   R0, [R1, R2]       @ [R1+R2]->R0

第四條指令抛蚁,將寄存器R1和R2的值相加作為操作數(shù)的有效地址,取得操作數(shù)后存入R0中惕橙。

2.5 多寄存器尋址

使用多寄存器尋址瞧甩,一條指令可以完成多個(gè)寄存器值的傳送,一條指令最多可以傳送16個(gè)通用寄存器的值弥鹦。例如:

LDMIA  R0, {R1,R2,R3,R4,}      @ [R0]->R1,[R0+4]->R2,[R0+8]->R3,[R0+12]->R4

該指令后綴IA表示每次執(zhí)行完讀取/存儲(chǔ)操作后肚逸,R0按字長(zhǎng)增加,因此,指令可以將連續(xù)存儲(chǔ)單元的值傳送到R1~R4朦促。

2.6 相對(duì)尋址

與基址變址尋址類似膝晾,相對(duì)尋址以程序計(jì)數(shù)器PC的當(dāng)前值作為基地址,指令中的地址標(biāo)號(hào)作為偏移量思灰,將兩者相加后得到操作數(shù)的有效地址玷犹。以下程序完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令BL采用了相對(duì)尋址方式:

BL    NEXT           @ 跳轉(zhuǎn)到子程序NEXT處執(zhí)行指令
    ......
NEXT
    ......
MV  PC, LR         @ 從子程序返回
2.7 堆棧尋址

? ? ? ? 堆棧是一種數(shù)據(jù)結(jié)構(gòu)洒疚,按先進(jìn)后出的方式工作歹颓,使用一個(gè)稱為堆棧指針的專用寄存器指示當(dāng)前的操作,堆棧指針總是指向堆棧頂端油湖。當(dāng)堆棧指針指向最后壓入的數(shù)據(jù)時(shí)巍扛,稱為滿堆棧;當(dāng)堆棧指針指向下一個(gè)將要壓入的位置時(shí)乏德,稱為空堆棧撤奸。
? ? ? ? 根據(jù)堆棧的生成方式,可分為遞增堆棧和遞減堆棧喊括。當(dāng)堆棧由低地址向高地址生成時(shí)胧瓜,稱為遞增堆棧,反之稱為遞減堆棧郑什。排列組合后可得到4中類型的堆棧工作方式府喳,ARM微處理器支持全部4種類型的堆棧工作方式。具體如下:

滿遞增堆棧:堆棧指針指向最后壓入的數(shù)據(jù)蘑拯,由低地址向高地址生成钝满。
滿遞減堆棧:堆棧指針指向最后壓入的數(shù)據(jù),由高地址向低地址生成申窘。
空遞增堆棧:堆棧指針指向下一個(gè)將要壓入數(shù)據(jù)的空位置弯蚜,由低地址向高地址生成。
空遞減堆棧:堆棧指針指向下一個(gè)將要壓入數(shù)據(jù)的空位置剃法,由高地址向低地址生成碎捺。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市玄窝,隨后出現(xiàn)的幾起案子牵寺,更是在濱河造成了極大的恐慌,老刑警劉巖恩脂,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帽氓,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡俩块,警方通過查閱死者的電腦和手機(jī)黎休,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門浓领,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人势腮,你說我怎么就攤上這事联贩。” “怎么了捎拯?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵泪幌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我署照,道長(zhǎng)祸泪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任建芙,我火速辦了婚禮没隘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘禁荸。我一直安慰自己右蒲,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布赶熟。 她就那樣靜靜地躺著瑰妄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪映砖。 梳的紋絲不亂的頭發(fā)上翰撑,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音啊央,去河邊找鬼。 笑死涨醋,一個(gè)胖子當(dāng)著我的面吹牛瓜饥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浴骂,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼乓土,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了溯警?” 一聲冷哼從身側(cè)響起趣苏,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梯轻,沒想到半個(gè)月后食磕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喳挑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年彬伦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滔悉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡单绑,死狀恐怖回官,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搂橙,我是刑警寧澤歉提,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站区转,受9級(jí)特大地震影響苔巨,放射性物質(zhì)發(fā)生泄漏甚垦。R本人自食惡果不足惜晦毙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望王污。 院中可真熱鬧厅缺,春花似錦蔬顾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窥妇,卻和暖如春舷胜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背活翩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工烹骨, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人材泄。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓沮焕,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親拉宗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峦树,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 算術(shù)和邏輯指令A(yù)DC : 帶進(jìn)位的加法(Addition with Carry)ADC{條件}{S} <dest...
    luffier閱讀 3,716評(píng)論 0 3
  • 所謂的尋址方式就是根據(jù)指令中的操作數(shù)的信息來尋找操作數(shù)實(shí)際物理地址的方式。根據(jù)指令中給出操作數(shù)的不同格式旦事,ARM指...
    iehshx閱讀 1,405評(píng)論 0 0
  • 計(jì)算機(jī)通過執(zhí)行指令序列來使機(jī)器得以工作魁巩,所以對(duì)于每一系列的計(jì)算機(jī)都有指定的一組指令集供計(jì)算機(jī)使用,這組指令...
    未來科技工作室閱讀 7,881評(píng)論 1 10
  • 按照編譯器不同姐浮,匯編分為兩大量:一類是ADS的匯編程序谷遂,一類是GNU匯編格式任。 以冒號(hào)結(jié)尾的標(biāo)識(shí)符都被認(rèn)為是...
    柏666閱讀 3,310評(píng)論 0 0
  • 大家好单料,我是圈子哥埋凯,姓名袁源点楼。重慶市大足區(qū)廣告?zhèn)髅饺耍ψ訝I銷·個(gè)人品牌·核心競(jìng)爭(zhēng)力·業(yè)余愛好·自媒體研究者實(shí)踐者...
    重慶圈子哥袁源閱讀 1,160評(píng)論 0 1