ARM指令
语法格式
<opcode>{<cond>}{S} <Rd>, <Rn>,<shifter_operand>
{}
表示是可选的部分,<>
表示是必要的部分
条件码
大部分ARM指令都支持条件执行,即满足某些条件的时候执行当前指令,同时,还配合有S
位用来指示当前指令是否会映像CPSR相应的位。
EQ | Equal | 相等 | Z=1 |
NE | Noequal | 不相等 | Z=0 |
CS/HS | CarrySet/HighorSame | 无符号数>= | C=1 |
CC/LO | CarryClear/LOwer | 无符号数< | C=0 |
MI | MInus | 负数 | N=1 |
PL | Plus | 非负数 | N=0 |
VS | oVerflowSet | 上溢出 | V=1 |
VC | oVerflowClear | 没有上溢出 | V=0 |
HI | HIgh | 无符号> | C=1&&Z=0 |
LS | LowerorSame | 无符号数<= | C=0 |
GE | GreaterorEqual | 带符号数>= | N=1&&V=1或 N=0&&V=0 |
LT | LessThan | 带符号数< | N=1&&V=0或 N=0&&V=1 |
GT | GreaterThan | 带符号数> | Z=0&&N=V |
LE | LessEqual | 带符号数<= Z=1&&N!=V | |
AL | 无条件执行 |
跳转
B指令跳转的范围是PC+-32M,因为ARM一条指令32bit,操作码B占了6bit,还有24bit装数据,考虑到ARM的地址是4byte对齐的,所以最后的两位都会是0,所以就可以用24bit数据表达26bit的地址空间,2^26=64M,即+-32M。如果需要跳转的地址距离PC超过了32M,可以将目标地址压栈,通过内存将地址传递给PC实现长跳转
B{<cond>} <target_addr>
BL{<cond>} <target_addr>
BX{<cond>}, <Rm>
BLX <target_address>
BLX{<cond>} <Rm>
数据处理
- 注意立即数的合法性问题
- 立即数=(8bit数据) ROR 偶数位,如果不能通过这种方式得到,就会报错
- {S}用于表示当前指令的操作结果是否影响CPSR中的相应位
MOV{<cond>}{S} <Rd>, <shifter_operand> ;数据传送
MVN{<cond>}{S} <Rd>, <shifter_operand> ;数据求反传送
ADD{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;加法
ADC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;带位加法
SUB{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;减法
SBC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;带位减法
RSB{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逆向减法
RSC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;带位逆向减法
AND{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逻辑与
ORR{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逻辑或
EOR{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;逻辑异或
BIC{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;位清除
CMP{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;比较
CMN{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;基于相反数的比较
TST{<cond>}{S} <Rd>, <Rn>, <shifter_operand> ;位测试
TEQ{<cond>} <Rn>, <shifter_operand> ;相等测试
数据处理指令的操作数寻址方式(shifter_operand)
<opcode>{<cond>}{S} <Rd>, <Rn>, <shifter_operand>
#<immediate> ;立即数寻址
<Rm> ;寄存器寻址
<Rm>,LSL #<shift_imm> ;立即数逻辑左移
<Rm>,LSL <Rs> ;寄存器逻辑左移
<Rm>,LSR #<shift_imm> ;立即数逻辑右移
<Rm>,LSR <Rs> ;寄存器逻辑右移
<Rm>,ASR #<shift_imm> ;立即数算术右移
<Rm>,ASR <Rs> ;立即数算术右移
<Rm>,ROR #<shift_imm> ;立即数循环右移
<Rm>,ROR <Rs> ;寄存器循环右移
<Rm>,RRX ;寄存器扩展循环右移
乘法指令
任何乘法指令都必须使用寄存器,不能使用立即数
MUL{<cond>}{S} <Rd>, <Rm>, <Rs> ;32位乘法
MLA{<cond>}{S} <Rd>, <Rm>, <Rs>, <Rn> ;32位带加数的乘法
SMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位有符号数乘法
SMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位带加数的有符号数乘法
UMULL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位无符号数乘法
UMLAL{<cond>}{S} <RdLo>, <RdHi>, <Rm>, <Rs> ;64位带加数的无符号数乘法
PSR指令
MRS{<cond>} <Rd>, CPSR ;将PSR的内容传送到通用寄存器中
MRS{<cond>} <Rd>, SPSR
MSR{<cond>} CPSR_<fields>, #<immediate> ;将通用寄存器的内容或一个立即数传送到PSR
MSR{<cond>} CPSR_<fields>, <Rm>
MSR{<cond>} SPSR_<fields>, #<immediate>
MSR{<cond>} SPSR_<fields>, <Rm>
内存访问
B字节,H半字,T用户模式,S由有符号
LDR{<cond> <Rd>, <addressing_mode> ;字数据读取
LDR{<cond>}B <Rd>, <addressing_mode> ;字节数据读取
LDR{<cond>}BT <Rd>, <addressing_mode> ;用户模式的字节数据读取
LDR{<cond>}H <Rd>, <addressing_mode> ;半字数据读取
LDR{<cond>}SB <Rd>, <addressing_mode> ;有符号的字节数据读取
LDR{<cond>}SH <Rd>, <addressing_mode> ;有符号的半字数据读取
LDR{<cond>}T <Rd>, <post_indexed_addressing_mode> ;用户模式的字数据读取
STR{<cond>} <Rd>, <addressing_mode> ;字数据写入
STR{<cond>}B <Rd>, <addressing_mode> ;字节数据写入
STR{<cond>}H <Rd>, <addressing_mode> ;半字数据写入
STR{<cond>}T <Rd>, < post_indexed_addressing_mode> ;用户模式字数据写入
批量内存访问
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers> ;批量内存字数据读取
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_without_pc> ;用户模式的批量内存字数据读取
LDM{<cond>}<addressing_mode> <Rn>{!}, <registers_and_pc> ;带PSR的批量内存字数据读取
STM{<cond>}<addressing_mode> <Rn>{!}, <registers> ;批量内存字数据写入
STM{<cond>}<addressing_mode> <Rn>, <registers> ;用户模式的批量内存字数据写入
异常发生指令
SWI{<cond>} <immed_24> ;软中断
BKPT <immediate> ;断点中断
ARM指令的更多相关文章
- iOS逆向工程之Hopper中的ARM指令
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...
- ARM指令教程
ARM指令教程 ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...
- ARM指令分类及其寻址方式
ARM指令分类及其寻址方式 一:ARM指令的分类 ARM指令集可以分为以下6类: •跳转指令: •数据处理指令: •程序状态寄存器(PSR)传输指令: •load/store指令: •协处理器指令: ...
- ARM指令学习,王明学learn
ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令 2.— MVN 数据取反传送指令 3.— CMP 比较指令 4.— CMN 反值比较指令 5.— TST 位测试 ...
- 头文件定义和ARM指令
2015.2.2星期一,阴天 内存管理:内存的分配和释放等静态和动态内存:主要是在释放方式上的区别 静态变量:编译时就已经确定,定义在函数外面自动变量:在程序运行时才能在栈中确定只读数据节:存放常量的 ...
- [置顶] ARM指令集和常用寄存器
1) ARM指令集 32位的 ARM指令和 16位 的Thumb指令 1,寄存器寻址 MOV R1, R2 //将寄存器R2的值传给寄存器R1 2,立即寻址 MOV R0, #0XFF00 //数据 ...
- ARM指令和Thumb指令区别
Thumb指令集 ]的问题而提出的,它具有16为的代码密度.Thumb不是一个完整的体系结构,不能指望处理程序只执行Thumb指令而不支持ARM指令集.因此,Thumb指令只需要支持通用功能,必要时, ...
- arm指令bne.w改成b,即无条件跳转
近期逆向一个程序,需要把bne.w改成b,无条件跳转.由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助.通过memory write 修改后,验证可行后,再用ultrae ...
- arm指令1
.section .text.writeFUNCTION(write) ldr r12, =__NR_write swi #0 bx lr LDR: LDR 的两种用法 1)LDR pc, =MyHa ...
随机推荐
- x8086汇编实现dos清屏(clear screen)
题目要求:x8086汇编实现dos下的清屏功能 80X25彩色字符模式显示缓冲区的结构: 在内存地址结构中,B8000H~BFFFFH共32KB的空间,为80x25彩色字符模式的显示缓冲区.向这个地址 ...
- 转:python signal信号
转自:http://www.jb51.net/article/74844.htm 在liunx系统中要想每隔一分钟执行一个命令,最普遍的方法就是crontab了,如果不想使用crontab,经同事指点 ...
- HTTP狀態碼
1xx消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于HTTP/1.0协议中没有定义任何1xx状态码,所以除非在某些试 ...
- C# Winform反序列化复杂json字符串
最近接的私单是一个CS项目,里面所有的操作都是通过调用API接口来进行的. 接口详细说明 协议:https 请求方式:post https://xx.xxx.net/app/clients 提交j ...
- Node.JS文件系统解析
1.Node.js 文件系统 var fs = require("fs") 2.异步和同步 读取文件内容的函数有异步的 fs.readFile() 和同步的 fs.readFile ...
- [翻译] Autofac 入门文档
原文链接:http://docs.autofac.org/en/latest/getting-started/index.html 在程序中使用Autofac的基本模式是: 用控制反转(IoC)的思想 ...
- linux常用命令之压缩打包
DF df – report file system disk space usage 查看文件系统的使用清空 用法 df [-hi] [path] 选项 -h human readable ,以人类 ...
- C#如何用delegate实现Javascript的each方法
C#中有很多易混淆的关键词,例如delegate,Func, Action和 Predicate.Func, Action和 Predicate本质上都是delegate,下面看一下delegate概 ...
- [html5+java]文件异步读取及上传核心代码
html5+java 文件异步读取及上传关键代码段 功能: 1.多文件文件拖拽上传,file input 多文件选择 2.html5 File Api 异步FormData,blob上传,图片显示 3 ...
- Spring(2) ------ 依赖注入
spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入. 1.set注入: 采用属性的set方法进行初始化,就成为set注入. 1)给普通字符类型赋值. public cl ...