文章目录

ARM 有7个基本工作模式:
注意:
CPU为什么设计这些模式

r13(sp) 栈指针寄存器
堆栈式一段按照后进先出原则组织起来的连续存储区域。用于程序保存或恢复数据,或用于子程序调用及中断响应时保护与恢复现场。sp是堆栈指针寄存器,存放着当前堆栈栈顶地址
r14(lr) 寄存器
**子程序的返回地址:**从子程序返回后,主程序继续执行的指令的地址称为子程序的返回地址
LR也叫链接寄存器,用于存放子程序的返回地址。在要进入子程序之前,先将子程序的返回地址存入LR
PC (r15)程序控制寄存器
PC 为程序指针,PC指向哪里,CPU就会执行哪条指令(所以跳转时就是把目标地址代码放到PC中)
CPSR,程序状态寄存器,important


cpsr和spsr的区别和联系
cpsr是程序状态寄存器,整个soC中只有1个;而spsr有5个,分别在5种异常模式下,作用是当从普通模式进入异常模式时,用来保存之前普通模式下的cpsr的,以在返回普通模式时恢复原来的cpsr
#ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载CPU的通用寄存器后才能被CPU处理
ldr 将内容从内存搬到通用寄存器load register
str 将内容从通用寄存器搬到内存store register
ldr/str组合实现ARM CPU和内存数据交换
#ARM 寻址方式
mov r1,r2 寄存器寻址
mov r0,#0xFF00 立即寻址
mov r0,r1,lsl #3 寄存器移位寻址
ldr r1,[r2,#4] 基址变址寻址
ldmia r1!,{r2~r7,r12} 多寄存器寻址
stmfd sp!,{r2-r7,lr} 堆栈寻址
#ARM 指令后缀,同一个指令附带不同后缀,变成不同的指令
B(byte)功能不变,操作长度为8位
H(half word)功能不变,操作长度为16位
S(signed)功能不变,操作数变为有符号
ldr ldrb ldrh ldrsb ldrsh
S(S标志)功能不变,影响CPSR标志位
#ARM 条件执行后缀
moveq r0, r1 @ 如果 eq 后缀成立,则直接执行 mov r0, r1
条件后缀是否成立,不是取决于本句代码,而是取决于这句代码之前的代码运行后的结果。
条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行
#ARM 多级指令流水线
为了增加处理器的指令流的速度,ARM使用多级流水线
不同arm架构会有所不同
#ARM 数据传输和跳转指令
① 数据处理指令:
mov mvn 数据传输指令
add sub rsb adc sbc rsc 逻辑指令
and orr eor bic 逻辑指令
cmp cmn tst teq 比较指令
mvl mla umull umlal smull smlal 乘法指令
clz 前导零计数
② cpsr 访问指令
mrs / msr
mrs 用来读cpsr msr用来写cpsr
cpsr寄存器比较特殊,需要专门的指令访问
③ 跳转(分支)指令
b / bl / bx
-b 直接跳转
-bl 跳转前把返回地址放入lr中,以便返回branch and link
-bx 跳转同时切换到ARM模式,一般用于异常处理的跳转
④ 访存指令
ldr / str & ldm / stm & swp
单个字/半字/字节访问 ldr/str
多字批量访问 ldm/stm
⑤ 软中断指令
swi(software interrupt) 软中断指令用来实现操作系统中系统调用
什么是协处理器
协处理器cp15操作指令
mcr & mrc
mrc 用于读取CP15中的寄存器
mcr 用于写入CP15中的寄存器
MRC & MCR的使用方法
mcr{<cond>} p15,<opcode_1>,<Rd>,<Crn>,<Crm>,{<opcode_2>}
- opcode_1:对于 cp15 永远为 0
- Rd:ARM 的普通寄存器
- Crn:cp15 的寄存器,合法值是 c0~c15
- Crm:cp15 的寄存器,一般均设为 c0
- opcode_2:一般省略或为 0
mrc p15,0,r0,c1,c0,0
orr r0,r0,#1
mcr p15,0,r0,c1,c0,0
#r举例子
- ldr / str每周期只能访问4字节内存,如果需要批量读取、写入内存时太慢,就用ldm / stm
- ldm load multiple
- stm store register multiple
stmia sp,{r0-r12}
将r0存入sp指向的内存处(假设为0x30001000)
然后地址+4(指向0x30001004),将r1存入该地址
然后地址+4(指向0x30001008),将r2存入该地址,。。。。。。。。。直到存完
#uu一个访存周期同时完成 13 个寄存器的读写uu
8 种后缀:
ia(increase after)先传输,再地址+4
ib(increase before)先地址+4,再传输
da(decrease after)先传输,再地址-4
db(decrease before)先地址-4,再传输
fd(full decrease)满递减堆栈,即一开始指向栈满的一下个可用位置
ed(empty decrease)空递减堆栈
fa(·······) 满递增堆栈
ea(·······)空递增堆栈
#i四种栈
空栈:栈指针指向空位,每次存入时可以直接存入然后栈指针移动一格;
而取出时需要先移动一格才能取出
满栈:栈指针指向栈中最后一格数据,每次存入时需要先移动栈指针一格再存入;
取出时可以直接取出,然后再移动指栈指针
增栈:栈指针移动时向地址增加的方向移动的栈
减栈:栈指针移动时向地址减小的方向移动的栈
伪指令的意义
gnu汇编中伪指令符号
常用 gnu 伪指令
偶尔会用到的 gnu 伪指令
最重要的几个伪指令
adr 和 ldr 的差别:ldr 加载的地址在链接时确定,而 adr 加载的地址在运行时确定;所以我们可以通过 adr 和 ldr 加载的地址比较来判断当前程序是否在链接时指定的地址运行。
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile
您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
对于我正在编写的Rails3应用程序,我正在考虑从本地文件系统上的XML、YAML或JSON文件中读取一些配置数据。重点是:我应该把这些文件放在哪里?Rails应用程序中是否有用于存储此类内容的默认位置?附带说明一下,我的应用程序部署在Heroku上。 最佳答案 我经常做的是:如果文件是通用配置文件:我在目录/config中创建一个YAML文件,每个环境有一个上层key如果我为每个环境(大项目)创建一个文件:我为每个环境创建一个YAML并将它们存储在/config/environments/然后我在加载YAML的地方创建了一个初始化
在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto
我目前还在上学,正在上一门关于用C++实现数据结构的类(class)。在业余时间,我喜欢使用“高级”语言(主要是Ruby和一些c#)进行编程。既然这些高级语言为你管理内存,你会用数据结构做什么?我可以理解对队列和堆栈的需求,但是您需要在Ruby中使用二叉树吗?还是2-3-4树?为什么?谢谢。 最佳答案 Sosincethesehigherlevellanguagesmanagethememoryforyou,whatwouldyouusedatastructuresfor?使用数据结构的主要原因与垃圾收集无关。但它是以某种方式有效的
它们可以这样定义Struct.new(:x,:y)但是用它们能做什么?具体来说,如何创建这种结构的实例?这行不通Struct.new(:x=>1,:y=>1)(您收到TypeError:can'tconvertHashintoString)。我正在使用Ruby1.9.2。更新:目前为止很好的指点,谢谢。我想我问这个的原因是我有好几次发现自己想要这样做Struct.new(:x=>1,:y=>1)这样我就可以在可以编写obj.x的地方传递一个对象,而不是说,实例化一个散列并必须编写obj[:x].在这种情况下,我希望该结构真正是匿名的-我不想通过命名从Struct.new调用返回的内容来
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion我很难找到在ruby中使用的树数据结构。我可以研究一些众所周知的吗?我的要求很简单。我想创建一棵树(或者可能是一个图)并找到一些节点之间的距离。例如,我可能有一个像下面这样的树/图A/\B-----C/\\DEF我希望能够找到根节点