Linux系统的GNU下的ARM汇编指令详解

时间:2022-12-06 01:01:57

一.算术与逻辑指令 

 

mvn r0, #0   将立即数取反送入r0  ff

ARM标准汇编有区别

sub 指令 

 SUB{条件}{S}  <dest>, <op 1>, <op 2>               

 dest = op_1 - op_2

 

dest和op1都不能是立即数(#1)

 

add和sub一样,op2不能是立即数

 

bic 位清除

 BIC{条件}{S}  <dest>, <op 1>, <op 2>              

 dest = op_1 and (!op_2)

   mov  r0,#0b101011

Eg: bic r1,r0,0b101011  (二进制数)

 

二.比较指令

 

cmp:比较

 cmp{条件}{P}  <op 1>, <op 2>               

 status = op_1 - op_2         ;得到状态位

 Eg: mov r1,#2   ;C 置1

      cmp r1,#1

 

      mov r1,#2   ;N 置1

      cmp r1,#3

 

      mov r1,#2   ;Z 置1

      cmp r1,#2

根据程序状态寄存器看结果:r15:cpsr的各位数的值

 

Bit  31  30  29  28  27  26  25------------2  1  0

       N   Z   C   V   I   F    程 序 计 数 器  S1 S0

标志的意义: 

  N  Negative        如果结果是负数则置位

  Z  Zero            如果结果是零则置位

  C  Carry           如果发生进位则置位

  O  Overflow        如果发生溢出则置位

  I  IRQ             中断禁用

  F  FIQ             快速中断禁用

 

tst:测试位

tst {条件}{P}  <op 1>, <op 2>                

Status = op_1 AND op_2 ;按位与

Eg: 

     mov r1,#0b101

     cmp r1,#0b001   ;按位与的结果赋给status

 

     mov r1,#0b101 

     cmp r1,#0b010 

 

后面也是在程序状态寄存器看结果:r15:cpsr的各位数的值

Bit  31  30  29  28  27  26  25------------2  1  0

       N   Z   C   V   I   F    程 序 计 数 器  S1 S0

标志的意义: 

  N  Negative        如果结果是负数则置位

  Z  Zero            如果结果是零则置位

  C  Carry           如果发生进位则置位

  O  Overflow        如果发生溢出则置位

  I  IRQ             中断禁用

  F  FIQ             快速中断禁用

 

 

三.跳转指令(分支指令)

分支

if(a>b)

{

a-b

}

else

{

a+b

}

 

 mov r1,#6

 mov r2,#5

 cmp r1,r2 

 bgt branch1    ; gt : 大于(有符号)

 

 add r3,r1,r2

 b end

 

 branch1:

 sub r3,r1,r2

 

 end 

 nop 

 

 

bl  带连接的分支

 

 

 mov r2,#3

 cmp r2,#1

 bl func1 //跳转到func1 

 

 mov r2,#3

 mov r2,#4

 mov r2,#5

 

 func1:

 mov r2,#1

 mov r3,#3

 mov pc,lr //回到跳转前的位置往下执行

 

 

 

 

 

四.移位指令

lsl 算术左移。

Eg:

mov r1,#0b1

mov r1,r1,lsl#2

 

ror 循环右移

Eg:

mov r1,#0b111

mov r1,r1,ror#1

 

 

 

 

 

 

 

 

 

五.程序状态字访问指令

mrs  r0,cpsr     ; 程序状态寄存器

orr   r0,#0b100

msr  cpsr,r0

 

 

六.存储器访问指令

 

ldr 从内存读出

 

 

str 写进内存

  mov r0, #0xff

  str r0, [r1]        ;r0的值写进地址为r1的内存

 

str fp, [sp,  #-4]!

sp的值减4赋给sp,fp的值写进现在sp地址处

加!号,表示将将sp的值减4赋给sp,不加!,sp的值不变

ldr 从内存读出

 ldr  r2, [r1]         ;r1地址的数据取出赋给寄存器r2