arm汇编指令

本文介绍了ARM汇编语言中的条件码、基本指令如跳转、加减法、乘法、逻辑操作、加载/存储以及状态操作,包括如何进行条件判断、数值运算、内存交互和中断处理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

条件码:

 

Code  Suffix  Flags              Meaning

0000  EQ     Z set               equal                    (= =)

0001  NE     Z clear             not equal                (! =)

0010  CS/HS  C set               unsigned higher or same  (>=) unsigned

0011  CC/LO  C clear             unsigned lower           (<)  unsigned

0100  MI     N set               negative                             

0101  PL     N clear             positive or zero

0110  VS     V set               overflow

0111  VC     V clear             no overflow

1000  HI     C set and Z clear   unsigned higher           (>) unsigned

1001  LS     C clear or Z set    unsigned lower or same    (<=) unsigned

1010  GE     N equals V          greater or equal          (>=) signed

1011  LT     N not equal to V    less than                 (<) signed

1100  GT     Z clear & (N ==V)  greater than             (>) signed

1101  LE     Z set | (N != V)    less than or equal        (<=) signed

1110  AL     (ignored) always    This suffix is normally omitted.

 

 

 

LR 保存返回PC地址

 

指令+S 则会影响cpsr  

 

b   类似  goto  fun                  # pc = fun

bl   类似子函数调用            lr = pc    pc = fun

 

 

mov  r0,r0  相当于 nop

mov  r0 , r1 , lsl #n  //左移n位,相当于乘于 2^n次方

mov  r0 , r1 , lsr #n  //右移n位,相当于乘于 2^n次方

mvn   r0,  r1  //将源操作数,取反赋值给目标

 

加法操作:

 

ADD  Rd,Rn,op2  //  Rd = Rn  + op2

ADC  Rd,Rn,op2  //  Rd = Rn  + op2  !c  带进位翻转减法

 

减法操作:

sub  Rd,Rn,op2  //  Rd = Rn  - op2

suc Rd,Rn,op2   //  Rd = Rn  - op2   !c  带进位翻转减法

rsb Rd,Rn,op2 // Rd = op2 - Rn

rsc Rd,Rn,op2 // Rd = op2 - Rn  !c  带进位翻转减法

 

乘法操作:

MUL  Rd,Rn,op2  //Rd = Rn *op2 保留32位结果同时影响 cpsr    -》Multiply

 

MLA R1,R2,R3,R4   //R1 = R2 * R3 + R4  乘----累加指令  ,同时影响cpsr   ->Multiply  accumulate

 

UMULL R0,R1,R2,R3   //(R0,R1) = R2 *R3  64位无符号乘法指令,结果地位存在R0中,高位存在 R1中

 

UMLAL  R0,R1,R2,R3  //(R0,R1) = R2 *R3 + (R0,R1)  64位无符号乘法指令 , 结果低位加上 R0  存放在R0中,高位 加上R1,存放在R1中

 

SMULL R0,R1,R2,R3   //(R0,R1) = R2 *R3  64位有符号乘法指令,结果地位存在R0中,高位存在 R1中

 

SMLAL  R0,R1,R2,R3  //(R0,R1) = R2 *R3 + (R0,R1)  64位有符号乘法指令 , 结果低位加上 R0  存放在R0中,高位 加上R1,存放在R1中

 

 

逻辑操作:

 

CMP  Rn,op2  //比较  Rn 与 op 2  是否相等;标识 为 Rn - op2 

CMN  Rn,0p2  // Rn  + op2  来影响 标识位 ,以作为 后续操作 的条件判断

 

 

and  r0, r1, r2 //将r1,r2按位与,将值赋给r0

orr  或  操作

eor  异或   操作

BIC Rd  ,Rn , op2  位清零  将Rn 按照 op2 中为1的位 进行清零,,结果放在Rd中

TST  Rn,op2   做逻辑与 ,结果不放在目标寄存器中 

TEQ  Rn,op2  做逻辑异或,这两个不影响cpsr  

与条件码 联合使用

 

 

 

 

 

load  / Store

 

LDR Rd,<addr_mode>  将存储器中的一个字装进Rd中

ldr  r0,=0x80009000  此时ldr为伪指令

ldr r0,[r1]  取出r1中地址所指向内容的值  为汇编指令

 

STR Rd,<addr_mode>  将寄存器中的值保存到存储器中

 

LDR  B   H  T  S

STR  B   H  T  

B是指操作一个字节 ,从低位开始操作

H是指操作半个字,从低位开始

T 是指在用户模式下,

S是指 有符号数

没有B/H  则指操作一个字(32位)

 

 

LDM 

ldmia   r1! ,{r3 -r9}   r1中存储了内存中的地址,将r1中地址指向的内容 分别存入r3 到  r9的寄存器 中,ia 为 每次地址增加4

stmia   r1!,{r3-r9}   r1中存储了内存中的地址,  将r3 -r9 的内容写入到 r1 对应的地址中,地址每次递增 4

 

 

SWP 字交换指令

 

swp  Rd,Rm,[Rn]   

swpb Rd,Rm,[Rn]  字节交换指令

 

跳转指令

 

B  跳转指令  B label  //使PC = label

BL  带返回的跳转指令  BL  label //使LR = PC  PC = label

 

 

状态操作指令

 

MRS 把状态寄存器的值 传入 通用寄存器

MRS  R0,CPSR//

 

MSR 把寄存器 的值传入 状态寄存器中,

MSR CPSR ,R0

 

使能IRQ:

ENABLE_IRQ

            MRS R0,CPSR

            BIC  R0,R0,#80

            MSR CPSR_C ,R0

            MOV PC,LR

 

 

DISABLE_IRQ

 

            MRS R0,CPSR

            ORR  R0,R0,#80

            MSR CPSR_C ,R0

            MOV PC,LR

          

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值