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
ARM六种寻址方式的汇编实现的更多相关文章
- ARM指令集详解--汇编
1. 汇编 1.1. 通用寄存器 通用寄存器 37个寄存器,31个通用寄存器,6个状态寄存器,R13堆栈指针sp,R14返回指针,R15为PC指针, cpsr_c代表的是这32位中的 ...
- Arm寄存器介绍及汇编基础
一.ARM处理器支持7种工作模式 ① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state) ② 快速中断模式(FIQ): 用于高速数据 ...
- ARM中C和汇编混合编程及示例(转)
在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...
- ARM指令集----寻址方式
ARM指令集可以分为跳转指令,数据处理指令,程序状态寄存器传输指令,LOAD/Store指令,协处理器指令和异常中断产生指令6类 ARM指令集的寻址方式 数据处理指令的操作数的寻址方式 字以及无符号字 ...
- ARM GCC 内嵌汇编手册
转自:http://blogold.chinaunix.net/u2/69404/showart_1922655.html ARM GCC 内嵌(inline)汇编手册 关于这篇文档这篇文章是本人为方 ...
- ARM 处理器寻址方式之间接寻址的几种表达
我们以 LDR 指令为例来分别举例分析. LDR 指令的格式为: LDR{条件} 目的寄存器,<存储器地址> LDR 指令是字加载指令,用于从存储器中将一个 32 位的字数据送到目的寄存器 ...
- ARM汇编
ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...
- 常用ARM汇编指令
常用ARM汇编指令 [日期:2012-07-14] 来源:Linux社区 作者:xuyuanfan77 [字体:大 中 小] 在嵌入式开发中,汇编程序常常用于非常关键的地方,比如系统启动时初 ...
- ARM汇编指令的一些总结-转
ARM汇编指令的一些总结ARM汇编指令很多,但是真正常用的不是很多,而且需要认真琢磨的又更少了.比较有用的是MOV B BL LDR STR还是通过具体汇编代码来学习吧.@ disable watch ...
随机推荐
- 【spark】示例:求Top值
我们有这样的两个文件 第一个数字为行号,后边为三列数据.我们来求第二列数据的Top(N) (1)我们先读取数据,创建Rdd (2)过滤数据,取第二列数据. 我们用filter()来过滤数据 line. ...
- VS2010 将程序发布至网站时,发生错误“未能给 bin/Debug/publish//setup.exe 签名“
VS2010 将程序发布至网站时,发生错误“未能给 bin/Debug/publish//setup.exe 签名“ 错误: 因为某项目未能生成,所以无法发布. ---------------- ...
- C#中upd分包与发送,已经实现全部代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Tool ...
- Python探索记(18)——文件File
# @Time : 2017/7/8 21:10 # @Author : 原创作者:谷哥的小弟 # @Site : 博客地址:http://blog.csdn.net/lfdfhl # @DESC : ...
- Hihocoder 1128 二分·二分查找
二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪 ...
- GlassFish的安装与使用(Windows)
前言 Glassfish是一款由Sun公司开发的(现由甲骨文公司赞助)开源的免费的应用服务器,它既是EJB容器也是WEB容器.Glassfish支持最新版的Java EE标准. Glassfish与T ...
- 剑指offer-第四章解决面试题的思路(栈的压入和弹出序列)
题目:输入两个整数序列,第一个序列表示栈的压入序列,请判断第二个序列是否为弹出序列. 思路:定义两个指针sPush和sPop分别指向两个整数序列的开头,借助一个辅助的栈,将第一个序列的数据依次压入栈中 ...
- 列表推导式,两个for循环的例子
[a for a in alist for b in blist if a>b] for i in alist,blist: print(i) >> alist[] >> ...
- OpenWRT mt7620n 系统升级引起的问题
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/qianguozheng/article/details/27237175 OpenWRT系统升级採用 ...
- java内存基础(一)
博客园 闪存 首页 新随笔 联系 管理 订阅 随笔- 35 文章- 0 评论- 29 关于Java 数组内存分配一点认识 //总结:[ 数组引用变量存储在栈内存中,数组对象存储在堆内存当中.数 ...