ARM汇编
五,ARM汇编
1,程序=数据结构+算法
2,与硬件相关的语言-汇编
1)诞生的背景
为了下与机器的微指令,上与内核的C语言的承上启下的交流功能。
2) 什么样子?
代码结构:
3) 利用工具ADS通过虚拟设备调式来学习汇编
4) ARM汇编指令格式
Operation {cond} Rd, Rn , Operand2
3,指令 条件Cond和状态Status码
- 条件码Cond
2)状态码status
4,立即数
如:#02
井号开头的数
立即数的范围:要被4整除
5,寻址方式
1)arm堆栈的几个概念
满堆栈(栈满)
空堆栈(栈空)
递增堆栈(进栈)
递减堆栈(出栈)
6,操作数(ALU操作数)
数学操作
逻辑操作
1)S标签
2)关于逻辑运算
比较操作
7,内存操作-读取内存
1)单寄存器读写指令
STR:按一个字存储到内存
LDR:按一个字从内存读取
STRB:按一个字节存储到内存
LDRB:按一个字节从内存读取
LDRH:按一个半个字(2字节)从内存读取
STRH:按一个半个字(2字节)存储到内存
LDRSB:有符号按一个字节从内存读取
STDRSH:有符号按一个半个字(2字节)存储到内存
2)多寄存器内存访问指令
3)数据交换指令
示例代码:
AREA testhello,CODE,READONLY
ENTRY
CODE32
START
MOV R1,#0x1f
MOV R0,#0x20
SWP R1,R1,[R2]
LDMIA R1,{R2,R3,R4,R5}
STMIA R0,{R2,R3,R4,R5}
LDMIB R1,{R2-R8}
STMDA R0,{R4-R9}
LDRB R0,[R1,#0x13]
STRB R0,[R1,#0x14]
MOV R2,#0x00400
CMP R1,#0x04
TST R1,#0x00200
TEQ R1,#0x01000
SBC R0,R1,R2
AND R0,R1,R2
BIC R3,R1,R2
ORR R4,R1,R2
EOR R5,R1,R2
MOV R1,#0xFFFFFFFF
MOV R2,#0x03
UMULL R3,R4,R1,R2
ADC R0,R1,#1
SUBS R0,R1,R2
ADD R1,R1,#0x12
ADD R2,R2,#0x11
ADD R3,R2,R1
MVN R0,#0x0f
MOV R1,#0x01
MOV R2,#0xff
ADDS R0,R1,R2
ADC R4,R0,#0x01
ADD R3,R2,#0x40
MOV R1,R3
MVN R0,#4
MVN R2,#0x0FF
SUB R4,R2,R0
END
8,跳转,状态操作
例1:
MOV LR,PC//将PC的当前地址赋值给LR寄存器,即LR跳转到当前指令语句
B:短指令跳转,只能上下跳转32个字节。
例子2:汇编跳转语句
跳转顺序: B WangWu ; break to WangWu
——>WangWu——>BL Zhangsan
——>Zhangsan——> MOV PC,LR
——>继续执行Wangwu之后的语句
AREA testhello,CODE,READONLY
ENTRY
CODE32
START
MOV R1,#0x1f
MOV R0,#0x20
SWP R1,R1,[R2]
B WangWu ; break to WangWu
MOV PC,#0x12
LDMIA R1,{R2,R3,R4,R5}
STMIA R0,{R2,R3,R4,R5}
Zhangsan
LDMIB R1,{R2-R8}
STMDA R0,{R4-R9}
LDRB R0,[R1,#0x13]
STRB R0,[R1,#0x14]
MOV PC,LR
WangWu
MOV R2,#0x00400
CMP R1,#0x04
TST R1,#0x00200
TEQ R1,#0x01000
BL Zhangsan
SBC R0,R1,R2
AND R0,R1,R2
BIC R3,R1,R2
ORR R4,R1,R2
EOR R5,R1,R2
END
BL Zhangsan:将当前的PC地址保存在了LR寄存器中,为MOV PC,LR时能够返回该地址。
例子3:arm汇编实现if(){ return hello ;}语句
BL hello //将hello函数的地址存放到LR寄存器并跳转到hello
SBC R0,R1,R2
AND R0,R1,R2
BIC R3,R1,R2 0
hello
ORR R4,R1,R2
EOR R5,R1,R2
CMP R11,#0x00 //将R11的值和值#0x00比较(相当于if())
MOVEQ PC,LR //若R11的值和值#0x00相等,则将LR里寄存的hello的地址给PC,然后程序返回(return hello)到hello函数继续执行。
例子4:汇编实现循环语句while(1);
loop
...其他语句
BL lopp
例子5:将状态寄存器里的数转移到普通寄存器里;CPSR——>R0
MRS R0,CPSR
状态寄存器操作
例子5:将普通寄存器里的数转移到状态寄存器里;R0——>CPSR
MOV R0,#0x12
MSR CPSR_cxsf,R0//将R0值写进去
MRS R3,CPSR//再将写进去的值读出来查看
_cxsf:域即32全部生效
异常产生指令
9,伪指令(类似于宏定义)
1)伪指令作用和类别
如下伪指令:
2)基本常用伪指令
例子1: 给寄存器起别名
SRegister RN R0 //通过RN 给R0起别名为SRegister
MOV SRegister,#0x12
例子2: EQU声明一个宏定义
WGCON1 EQU 0x32000000 //声明宏WGCON1
【注意】伪指令要左边顶格写,否则出错
3)在汇编语言程序中常用的符号
<I>符号命名约定
<2>符号变量
例子:定义变量
GBLA count1 //定义变量 count1
count1 SETA 0x2//给count1赋值,记住立即数 不用加#号
LDR R0,=count1//将 count1 的值 赋给R0
GBLL Bit2
Bit2 SETL {TRUE}
GBLS Name
Name SETS "wanggang"
定义一堆寄存器的别名
如:
Reist RLIST {R0-R8} //通过RLIST将R0 ~ R8 起别名为Relist
LDMIA R2,RLIST //通过 LDMIA 命令将以R2为基地址的内存块内容读取到Relist寄存器群中
<3>常量
常量赋值:
LDR R0,=0x12//直接将0x12值用=赋给R0就行
<4>变量代换$
<5>表达式和运算符
4)寄存器操作
5)数据定义伪汇编
例子:用DCB指令在内存以字节为单位分配一片空间,然后将写入相应设置的值
docontrol DCB 0x01,0x02,0x3,0x04 //通过DCB为四个字节0x01,0x02,0x3,0x04起个别名docontrol
ADR R2,docontrol//将这四个字节存储到以R2为基地址的一片连续的字节地址空间
或也可以是字符,字符存储的是字符的ascll码
docontrol DCB “hello" //通过DCB为"hello"起个别名docontrol
ADR R2,docontrol//将这个"hello"的ascll码存储到以R2为基地址的一片连续的字节地址空间
6)控制伪指令
例子:IF ELSE ENDIF语句
GBLL Bit2
Bit2 SETL {TRUE}
IF Bit2 ={TRUE}
MOV R4,#0x06
ELSE
MOV R1,#0x05
ENDIF
例子:WHILE WEND
GBLA age
age SETA 0x18
WHILE age < 0x20
age SETA 0x21
WEND
例子:定义一个名为helloworld的宏
上一篇: 宝宝不爱吃蔬菜可以用水果代替吗
下一篇: 姜茶能祛湿吗,喝姜茶还有这种好处
推荐阅读
-
iOS逆向工程之Hopper中的ARM指令详解
-
iOS Xcode汇编模式切换的方法介绍
-
iOS逆向工程之Hopper中的ARM指令详解
-
iOS安全防护系列之ptrace反调试与汇编调用系统方法详解
-
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
-
iOS Xcode汇编模式切换的方法介绍
-
C# 通过 inline-asm 解决嵌入x86汇编
-
iOS安全防护系列之ptrace反调试与汇编调用系统方法详解
-
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
-
三星联手ARM:5nm工艺加速冲向下代高端CPU