ARM备忘
mov: move
sub: subtract
cmp: compare
cmpls: ls--->lower or same, le--->less or equal, hi--->higher
ldr: load register
lsl: logical shift left
str: store register
b: branch
bl: branch label, change pc
bne: branch not equal
beq: branch equal
blt: branch less than
push {r4, r5} : store r4, r5 to stack
pop {r4, r5}: restore r4, r5 from stack
ldm: load multiple
stm: store multiple
and:
ldrd r0, r1, [r2, #4] : load 8 bytes from r2 + 4, and high 4 bytes stored in r0, lower in r1
.align 2: 2 * 2 = 4, the ldr instruction we used to read memory only works at addresses that are multiples of 4
tst : compares two numbers by computing the logical and operation of the numbers, and then comparing the result with 0
strh reg,[dest]: stores the low half word number in reg at the address given by dest.
alias .req: reg sets alias to mean the register reg.
.unreq alias: removes the alias alias.
teq reg,#val: checks if the number in reg is equal to val.
========================================
Register | Brief | Preserved | Rules |
---|---|---|---|
r0 | Argument and result | No | r0 and r1 are used for passing the first two arguments to functions, and returning the results of functions. If a function does not use them for a return value, they can take any value after a function. |
r1 | Argument and result | No | |
r2 | Argument | No | r2 and r3 are used for passing the second two arguments to functions. There values after a function is called can be anything. |
r3 | Argument | No | |
r4 | General purpose | Yes | r4 to r12 are used for working values, and their value after a function is called must be the same as before. |
r5 | General purpose | Yes | |
r6 | General purpose | Yes | |
r7 | General purpose | Yes | |
r8 | General purpose | Yes | |
r9 | General purpose | Yes | |
r10 | General purpose | Yes | |
r11 | General purpose | Yes | |
r12 | General purpose | Yes | |
lr | Return address | No | lr is the address to branch back to when a function is finished, but this does have to contain the same address after the function has finished. |
sp | Stack pointer | Yes |
sp is the stack pointer, described below. Its value must be the same after the function has finished. |
========================================
movw 与 movt 指令
movw 与 movt 一般结合使用,用来往寄存器中加载一个 32 bit value。
环境:xcode 4.6.2,iPad 2, lldb
代码:
void ArmTest() {
asm (
"movw r1, #0xF8C4\n\t" // 1
"movt r1, #0x40\n\t" // 2
"mov r0, r0"
);
}
在函数的开始部分设置断点,
然后读取 r1 寄存器的值(register read r1):r1 = 0x00000000
使用 ni 调试指令来继续执行一条指令,读取 r1 寄存器的值:r1 = 0x0000f8c4
继续单指令执行,读取寄存器值:r1 = 0x0040f8c4
可以得到结论:movw 将值加载到寄存器的低 16 位,movt 加载到高 16 位,合起来加载一个 32 bit value。
========================================
- Register Alt. Name Usage
- r0 a1 First function argument Integer function result Scratch register
- r1 a2 Second function argument Scratch register
- r2 a3 Third function argument Scratch register
- r3 a4 Fourth function argument Scratch register
- r4 v1 Register variable
- r5 v2 Register variable
- r6 v3 Register variable
- r7 v4 Register variable
- r8 v5 Register variable
- r9 v6
- rfp Register variable Real frame pointer
- r10 sl Stack limit
- r11 fp Argument pointer
- r12 ip Temporary workspace
- r13 sp Stack pointer
- r14 lr Link register Workspace
- r15 pc Program counter
========================================
movs 说明
movs r3, #0
cpsr {
0x30,
n = 0x0,
z = 0x0,
c = 0x0,
v = 0x0,
q = 0x0,
j = 0x0,
ge = 0x0,
e = 0x0,
a = 0x0,
i = 0x0,
f = 0x0,
t = 0x1,
mode = 0x10
}
执行后:
cpsr {
0x40000030,
n = 0x0,
z = 0x1,
c = 0x0,
v = 0x0,
q = 0x0,
j = 0x0,
ge = 0x0,
e = 0x0,
a = 0x0,
i = 0x0,
f = 0x0,
t = 0x1,
mode = 0x10
}
总之,movs 在 mov 的功能基础上影响标志位(zero位)。
=============================
bic 指令
bic Rd, Rn, Oprand2
BIC(位清除)指令对 Rn 中的值 和 Operand2 值的反码按位进行逻辑“与”运算。
BIC 是 逻辑”与非” 指令, 实现的 Bit Clear的功能
举例:
BIC R0, R0 , #0xF0000000
#将 R0 高4位清零
BIC R1, R1, #0x0F
#将R1 低4位清0
RSB 反向减法
Rn, Operand2
RSB(反向减法)指令可从 Operand2 中的值减去 Rn 中的值。
这是很有用的,因为有了该指令,Operand2 的选项范围就会更大。
例如:
RSB r4, r4, #1280
从1280中减去 R4
RSB R4, R0, #0×46
从0×46 中 减去 R0, 放入R4
===================================
STM 与 LDM
STM和LDM的主要用途是现场保护、数据复制、参数传递等,其模式有8种,如下:
注:前面4种用于数据块的传输,后面4种用于堆栈操作
(1)IA 每次传送后地址加4
(2)IB 每次传送前地址加4
(3)DA 每次传送后地址减4
(4)DB 每次传送前地址减4
(5)FD 满递减堆栈
(6)FA 满递增堆栈
(7)ED 空递减堆栈
(8)EA 空递增堆栈
下面的讲述对于空递减堆栈和空递增堆栈同样适用.
在堆栈操作时,经常错误以为使用STMFD满递减将寄存器压入堆栈后,在弹出数据的时候应该使用LDMFA。
但是FD和FA仅用于指示目前操作的堆栈是何种模式(堆栈共有四种模式),FD指明目前的堆栈是满递减堆栈,
则数据入栈时的指令为STMFD,那么数据出栈时的指令对应的为LDMFD,而不是LDMFA。
我们可以这样认为STMFD等价于STMDB,LDMFD等价于STMIA
那么,数据传输的顺序和数据入栈的顺序又是如何呢
先来看STMFD SP!,{R1-R3} 执行的结果图(操作之后SP指向SP')
SP-------> |R3|
|R2|
SP'------>|R1|
那么STMFD SP!,{R3,R2,R1}执行后的堆栈顺序是不是刚好和上面的堆栈顺序相反,实际情况时这两个指令执行后的堆栈数据顺序一样,因为ARM编译器会自动将STMFD SP!,{R3,R2,R1}转换为STMFD SP!,{R0-R3}指令,也就是说,ARM编译器默认高寄存器优先存入堆栈。即便你在指令STMFD SP!,{R3,R2,R1}中刻意“安排”了寄存器入栈顺序,而在编译时编译器又重新做了处理,打乱了你期望的数据入栈顺序。
同理STMDB R0!,{R1-R3}和STMDB R0!,{R3,R2,R1}指令执行后数据在堆栈中的顺序完全一致。
STMFD SP!,{R1-R3}指令对应的出栈指令是LDMFD SP!,{R1-R3}(R1,R2,R3的顺序任意)
===================================
CBZ & CBNZ
比较,为零则跳转;比较,为非零则跳转。
语法
- CBZ Rn, label
- CBNZ Rn, label
其中:
Rn
-
是存放操作数的寄存器。
label
-
是跳转目标。
用法
可以使用 CBZ
或 CBNZ
指令避免更改条件代码标记并减少指令数目。
除了不更改条件代码标记外,CBZ Rn, label
与下列指令序列功能相同:
- CMP Rn, #0
- BEQ label
除了不更改条件代码标记外,CBNZ Rn, label
与下列指令序列功能相同:
- CMP Rn, #0
- BNE label
限制
跳转目标必须在指令之后的 4 到 130 个字节之内。
===================================
IT EQ /* if the EQ condition is true, (T)hen execute the next instruction */
MOVEQ r0, #1 /* note the redundant condition code, which needs to match the IT instruction */
------------------
ITE EQ /* if the EQ condition is true, (T)hen execute the next instruction (E)lse execute the instruction after it */
MOVEQ r0, #1
MOVNE r0, #0 /* note that the condition code must be inverted, since this is an "else" instruction */
===================================
ARM备忘的更多相关文章
- GIS部分理论知识备忘随笔
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.高斯克吕格投影带换算 某坐标的经度为112度,其投影的6度带和3度带 ...
- python序列,字典备忘
初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...
- Vi命令备忘
备忘 Ctrl+u:向文件首翻半屏: Ctrl+d:向文件尾翻半屏: Ctrl+f:向文件尾翻一屏: Ctrl+b:向文件首翻一屏: Esc:从编辑模式切换到命令模式: ZZ:命令模式下保存当前文件所 ...
- ExtJs4常用配置方法备忘
viewport布局常用属性 new Ext.Viewport({ layout: "border", renderTo: Ext.getBody(), defaults: { b ...
- [备忘] Automatically reset Windows Update components
这两天遇到Windows 10的更新问题,官方有一个小工具,可以用来修复Windows Update的问题,备忘如下 https://support.microsoft.com/en-us/kb/97 ...
- ECMAScript 5(ES5)中bind方法简介备忘
一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...
- MFC通过txt查找文件并进行复制-备忘
MFC基于对话框的Demo txt中每行一个23位的卡号. 文件夹中包含以卡号命名的图像文件.(fpt或者bmp文件) 要求遍历文件夹,找到txt中卡号所对应的图像文件,并复制出来. VC6.0写的. ...
- php 相关模块备忘
在安装php的时候,不管是编译安装: ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
- 『备忘』HttpWebRequest 在 POST 提交时, 标头(Headers)丢失原因
近来研究 HttpWebRequest —— 辅助类完成时,POST JSON数据 总会 丢失标头(Headers). HttpWebRequest POST JSON数据,分如下几步: > 将 ...
随机推荐
- Hibernate各保存方法之间的差 (save,persist,update,saveOrUpdte,merge,flush,lock)等一下
hibernate保存 hibernate要保存的目的是提供一个方法,多.它们之间有许多不同之处,点击此处详细说明.使得差: 一.预赛: 在所有.阐释.供hibernate,,transient.p ...
- Controller与Action
Controller与Action 我们知道在MVC5和之前的版本,两个框架的生命周期是不一样的,在新版MVC6中,MVC Controller/Web API Controller已经合二为一了,本 ...
- 理解JavaScript继承
原文:理解JavaScript继承 对于JavaScript的继承和原型链,虽然之前自己看了书也听了session,但还是一直觉得云里雾里,不禁感叹JavaScript真是一门神奇的语言.这次经过Sp ...
- cmd介面,进adb命令提示符error
有几个操作的电话系统测试,需要输入adb命令时出现了头疼的事,当输入命令,一个直接报执行:error 推荐处理的方法: 1.当然就是关机重新启动.之前我是这样,挺麻烦.必进在win7上输入命令费时间. ...
- linux_windows下配置tomcat区别 ,不同子域名映射不同 项目
windows下 均为修改tomcat/bin/server.xml 在最后 替换 注意 docBase / <Realm className="org.apache.catalina ...
- MSSQL发现第五到数据的第十
第二十数据查询数据库,第十条数据,两起案件: 1,ID是连接的,当然这样的情况比較好查.直接SELECT就能够了.取ID大于5小于10就能够了, 这样的情况比較少. 2.ID不是连接的.假设要取第五条 ...
- MySql绿色版配置及使用详解
原文:MySql绿色版配置及使用详解 最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySq ...
- 高性能双端js模板---simplite
simplite是一款js实现的模板引擎,它能够完成浏览器端js模版和node服务器端js模板的数据渲染,渲染性能达到引擎的极限. 渲染性能十分突出. 支持浏览器端和node服务器端模板渲染. 它简单 ...
- 检测浏览器版本类型的JavaScript代码,终极版
下面的JavaScript代码,不仅可以判断PC端浏览器类型,还可以判断安卓.iOS.其他智能手机.平板电脑或游戏系统. 说废话貌似不是我的风格哈,直接上代码吧: var client = funct ...
- 华硕K55DR体验 - 显卡就是坑
朋友拿来电脑,本来他室友已经把他电脑重做完了,但还是卡,非要给我再搞一遍,难道?我就是传说中的大神?咳咳...YY一下,适可而止 华硕K55DR的配置来看,似乎应付CF没什么问题,可是,FPS各种不稳 ...