ARM六种寻址方式的汇编实现
2016-04-21 23:42
183 查看
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
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
相关文章推荐
- Linux 中断底半部机制
- Android的menu(菜单)按钮的使用(by 星空武哥)
- Linux下编写运行访问MYSQL的程序以及MYSQL在linux下的下载安装
- 20150116--Cookie+Session-02
- 机器人网站查询
- WEB服务器6--IIS架构补充篇
- 第八周——第九周学习总结
- Linux系统 工作笔记
- MySQL_Php.php
- codec-wm8960分析
- 有效回文串
- 杭州--4.21
- 数据挖掘导论--数据
- 我和我的同伴是如何用具体的代码例子,说明源代码管理的基本操作
- QLabel显示边框
- 机器人的雅克比矩阵
- Flink如何应对背压问题
- Java基础-break,continue,return
- js中bind、call、apply函数的用法
- 个人工作总结04