ARM 匯編&ARM 指令集
1、寄存器尋址
本文引用地址:http://m.butianyuan.cn/article/201611/321412.htm操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值操作
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ù)的有效地址,用于訪問寄存器附近存儲單元
LDR R2,[R3,#0x0F] ;將R3 中的數(shù)值加0x0F 作為地址,取出此地址的數(shù)值保存在R2 中
STR R1,[R0,#-2] ;將R0 中的數(shù)值減2 作為地址,把R1 中的內(nèi)容保存到此地址位置
6、多寄存器尋址
多寄存器尋址就是一次可以傳送幾個寄存器值,允許一條指令傳送 16 個寄存器的任何子集或所有寄存器。
LDMIA R1!,{R2-R7,R12} ;將R1 單元中的數(shù)據(jù)讀出到R2-R7,R12,R1 自動加1
STMIA R0!,{R3-R6,R10};將R3-R6,R10 中的數(shù)據(jù)保存到R0 指向的地址,R0 自動加1
7、堆棧尋址
堆棧是特定順序進(jìn)行存取的存儲區(qū),操作順序分為“后進(jìn)先出”和“先進(jìn)后出”,
堆棧尋址時隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),
指針?biāo)赶虻拇鎯卧褪嵌褩5臈m?。存儲器堆棧可分為兩種:
向上生長:向高地址方向生長,稱為遞增堆棧
向下生長:向低地址方向生長,稱為遞減堆棧
堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個要
放入的空位置,稱為空堆棧。這樣就有4 中類型的堆棧表示遞增和遞減的滿堆棧和空堆
棧的各種組合。
滿遞增:堆棧通過增大存儲器的地址向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的
最高地址。指令如LDMFA,STMFA 等。
空遞增:堆棧通過增大存儲器的地址向上增長,堆棧指針指向堆棧上的第一個空
位置。指令如LDMEA,STMEA 等。
評論