ARM六种寻址方式的汇编实现

AREA Example,CODE,READONLY
ENTRY
CODE32

;S 后缀:更新标志位CPSR
;!后缀:基址寄存器中的地址发生变化
;LDR 从存储器中加载数据到寄存器
;STR 从寄存器中加载数据到存储器

;立即寻址
MOV R0 ,#2
SUBS R0,R0,#2

;寄存器寻址
MOV R2,#2
MOV R1,R2

ADDS R0,R1,R2;

;寄存器间接
LDR R3,=0X40000000;LDR伪指令,把地址加载到寄存器里面去
STR R0,[R3];0x40000000代表着一个存储器,把R0寄存器的内容,传送到0X40000000地址的存储器中
;以上步骤其实是设定0x40000000存放4

LDR R4,[R3];寄存器间接其实是这一步 R3--->0x40000000----->4


;基址变址寻址
LDR R4,=0X40000004
STR R0,[R4]
LDR R4,[R3,#0x04];把首地址加上偏移量得到数据的地址再寻址 R3------->0x40000000+4=0x40000004----->4

;堆栈寻址
MOV R1,#1
MOV R2,#2
MOV R3,#3
MOV R4,#4

LDR SP,=0x40000000;堆栈首地址
;要注意0x40000000以上的地址才有效,用满递减的话,0x40000000开头,压进去一个,就变成0x3FFFFFFC了,数据会丢失


;一个个压栈
;满递增 压入一个 sp会加4
STMFA SP!,{R1}
STMFA SP!,{R2}
STMFA SP!,{R3}
STMFA SP!,{R4}
;或者STMFA SP!,{R1-R4}

LDMFA SP!,{R7-R10};出栈,将数据放置到R7-R10中


;多寄存器寻址
LDR R0,=0X40000000
STR R1,[R0]
STR R2,[R0,#4]
STR R3,[R0,#8]
STR R4,[R0,#12]

LDMIA R0,{R5,R6,R11,R12}
;其实跟堆栈差不多
;就是把[R0]---->R1,R0+4]---->R2,[R0+8]---->R3,[R0+12]---->R4
;每隔一个参数就加4,但R0的基地址不变







END

原文地址:https://www.cnblogs.com/wzben/p/5419452.html