arm汇编指令

来源:互联网 发布:知乎下载电脑版 编辑:程序博客网 时间:2024/05/29 15:46
//一般ARM官方风格汇编指令为大写,windows/ADS/MDK
//实际运用一般用GNU风格,为小写,linux

(1)
ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中内容加载入CPU中通用寄存器中才能被  CPU处理
ldr(loadregister)指令将内存内容加载入通用寄存器。
str(storeregister)指令将寄存器内容存入内存空间中。
ldr/str组合用来实现ARM CPU和内存数据交换
ARM模式/thumb模式(16位)
各模式及对应的寄存器(S5PV210):

(2)
寄存器寻址  mov r1, r2
立即寻址  mov r0, #0xFF00
寄存器移位寻址  mov r0, r1, lsl #3
寄存器间接寻址  ldr r1, [r2]
基址变址寻址  ldr r1, [r2, #4]
多寄存器寻址  ldmia r1!, {r2-r7, r12}     //保存现场是可用到
堆栈寻址  stmfd sp!, {r2-r7, lr}          //恢复现场是用到,此时寄存器指的是后者
相对寻址       beq flag

常用指令:
  算数指令:ADD ,SUB,MVL
  逻辑与比较指令:AND,ORR,BIC,EOR
  读写CPSR指令:MRS,MSR       //MRS中R在前面,用来读CPSR;MSR用来写到CPSR中去
  跳转指令:b(不打算返回的),bl(返回地址保存在lr,用于函数调用),bx(并切换ARM模式,用于异常跳转
  访存指令:LDR(可用作伪指令,=XXX实现立即数合法化),STR,STM,LDM,ADR(伪指令,相对于LDR,短跳转
            ,编译时以PC为基准,用ADD/SUB代替;而LDR长跳转,以链接地址为基准,用MOV代替)
  软中断指令:SWI陷入,实现系统调用。
  伪指令:ADR,LDR,NOP(空操作),ADRL(中等范围地址加载指令),其他伪指令
.global _start  @ 给_start外部链接属性
.section .text  @ 指定当前段为代码段
.ascii   .byte   .short   .long   .word
.quad    .float    .string @ 定义数据
.align 4  @以16字节对齐
.balignl 16 0xabcdefgh   @ 16字节对齐填充
.equ  @类似于C中宏定义


(3)指令执行后缀
同一指令经常附带不同后缀,变成不同的指令。经常使用的后缀有:
B(byte)功能不变,操作长度变为8位
H(halfword)功能不变,长度变为16位
S(signed)功能不变,操作数变为有符号
如 ldr ldrb ldrh ldrsb ldrsh
S(S标志)功能不变,影响CPSR标志位
如 mov和movs  movs r0, #0

常用后缀:
•ia(increaseafter)先传输,再地址+4
•ib(increasebefore)先地址+4,再传输
•da(decreaseafter)先传输,再地址-4
•db(decreasebefore)先地址-4,再传输
•fd(fulldecrease)满递减堆栈
•ed(emptydecrease)空递减堆栈
•fa(·······) 满递增堆栈
•ea(·······)空递增堆栈
一般使用满减栈,即用ldmia,stmfd操作。


常用符号后缀:^在目标寄存器中有PC寄存器时,会将SPSR写回至CPSR(现场恢复)
                            LDMIA r0!,{r2-r3} r0的值在ldm过程中发生的改变(+/-)写回到r0中







(4)条件执行后缀



(5)协处理器指令
  ARM理论可支持16个协处理器,实际上只实现CP15(coprocessor)
  协处理器和MMU、cache、TLB等处理有关,功能上和操作系统的虚拟地址映射、cache管理等有关。
     用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
记住格式:p15      0        普通Disco    后面三个cp15的参数(? c0  0)


         
0 0
原创粉丝点击