ARM 匯編&ARM 指令集
1、寄存器尋址
本文引用地址:http://www.biyoush.com/article/201611/321412.htm操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值操作
MOV R1,R2 ;R2 -> R1
SUB R0,R1,R2 ;R1 - R2 -> R0
2、立即尋址
地址碼部分就是操作數(shù),(操作數(shù))立即數(shù)就在指令中
SUBS R0,R0,#1 ;R0 – 1 -> R0
MOV R0,#0xff00 ;0xff00 -> R0
3、寄存器偏移尋址
MOV R0,R2,LSL #3 ;R2 的值左移3 位,結(jié)果放入R0,即R0 = R2 * 8
ANDS R1,R1,R2,LSL R3 ;R2 的值左移R3 位,然后和R1 相與操作,結(jié)果放入R1
4、寄存器間接尋址
寄存器為操作數(shù)的地址指針
LDR R1,[R2] ;將R2 中的數(shù)值作為地址,取出此地址中的數(shù)據(jù)保存在R1 中
SWP R1,R1,[R2];將如中的數(shù)值作為地址,取出此地址中的數(shù)值與R1 中的值交換
5、基址尋址
將基址寄存器的內(nèi)容與偏移量相加,形成操作數(shù)的有效地址,用于訪問寄存器附近存儲(chǔ)單元
LDR R2,[R3,#0x0F] ;將R3 中的數(shù)值加0x0F 作為地址,取出此地址的數(shù)值保存在R2 中
STR R1,[R0,#-2] ;將R0 中的數(shù)值減2 作為地址,把R1 中的內(nèi)容保存到此地址位置
6、多寄存器尋址
多寄存器尋址就是一次可以傳送幾個(gè)寄存器值,允許一條指令傳送 16 個(gè)寄存器的任何子集或所有寄存器。
LDMIA R1!,{R2-R7,R12} ;將R1 單元中的數(shù)據(jù)讀出到R2-R7,R12,R1 自動(dòng)加1
STMIA R0!,{R3-R6,R10};將R3-R6,R10 中的數(shù)據(jù)保存到R0 指向的地址,R0 自動(dòng)加1
7、堆棧尋址
堆棧是特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順序分為“后進(jìn)先出”和“先進(jìn)后出”,
堆棧尋址時(shí)隱含的,它使用一個(gè)專門的寄存器(堆棧指針)指向一塊存儲(chǔ)區(qū)域(堆棧),
指針?biāo)赶虻拇鎯?chǔ)單元就是堆棧的棧頂。存儲(chǔ)器堆??煞譃閮煞N:
向上生長(zhǎng):向高地址方向生長(zhǎng),稱為遞增堆棧
向下生長(zhǎng):向低地址方向生長(zhǎng),稱為遞減堆棧
堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng),稱為滿堆棧;堆棧指針指向下一個(gè)要
放入的空位置,稱為空堆棧。這樣就有4 中類型的堆棧表示遞增和遞減的滿堆棧和空堆
棧的各種組合。
滿遞增:堆棧通過增大存儲(chǔ)器的地址向上增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的
最高地址。指令如LDMFA,STMFA 等。
空遞增:堆棧通過增大存儲(chǔ)器的地址向上增長(zhǎng),堆棧指針指向堆棧上的第一個(gè)空
位置。指令如LDMEA,STMEA 等。
評(píng)論