ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)

【预备知识】
ARM处理器的工作模式:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第1张图片

Cortex-A寄存器组织概要:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第2张图片

指令:
编译完成后作为一条指令存放在内存单元中,在CPU执行时完成一定的操作。

(1) 数据搬移指令:mov、mvn
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第3张图片

_start:
    mov r0, #1 @;搬移有效数
    mov r1, r0 @;寄存器之间数据搬移
	.end

备注:
立即数:0-255之间的数
有效数:
1、本身就在0-255之间的数
2、循环右移偶数位能够得到0-255之间的数
3、能够通过按位取反得到0-255之间的数
4、能够通过按位取反,取反后的值通过循环右移偶数位得到0-255之间的数

底层现象
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第4张图片
运行程序之后的现象:把1放入r0中,再把r0中的数放入r1中。程序计数器(PC)的作用是存放处理器要读取的下一条指令的地址,一条指令占四个字节,故此时执行了两条指令,pc的值为8。

 _start:
  mvn r1, #0xff000000
  	.end  

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第5张图片
运行程序之后的现象:将目标数取反放入r1,pc置4.

(2)算术运算:add、adc、sub、sbc、rsb、rsc、mul、mla
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第6张图片

 _start:
    mov r0, #2
    mov r1, #3
    add r2, r1, #3 @ r2 = r1 + 3
    add r1, #3  @ r1 += 3
	.end 

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第7张图片
2,3分别被放入r0,r1;r2=r1+r0=6;r2=r1=3=6;pc的值为0x10

 _start:
 	mov r0, #0xffffffff @ 0xffffffff + 2 = 0x1 00000001
    mov r1, #2
    
    adds r2, r1, r0 @; r2 = r1 + r0, CPSR_NZCV = 运算结果过,产生进位C=1
      	.end  

备注:
【CPSR】
Current Programma Status Rister当前程序状态寄存器,用来保存当前处理器状态
N = 符号位,0表示正数,1表示负数
Z = 0标志位,为1表示结果为0,0表示结果不为0
C = 进位标志(针对无符号数,因为对于有符号来说进位等于溢出,但是溢出标志V有了)
V = 溢出标志(针对有符号数,因为针对无符号数来说,溢出等于进位)
I = 禁止IRQ
F = 禁止FIQ
T = 处理器工作状态

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第8张图片
相加后产生进位
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第9张图片
CPSR的C为置为1. r2 = r1 + r0, CPSR_NZCV = 运算结果过,产生进位C=1

 _start:
	mov r0, #0x2
    mov r1, #1 @;加数1
    
    mvn r2, #0
    mov r3, #1 @;加数2
    
    adds r4, r0, r2
    adc r5, r1, r3  @ r5 = r1 + r3 + CPSR_C
       	.end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第10张图片
注意这里的加法产生了进位。
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第11张图片

  _start:
 	mov r0, #2
    mov r1, #3 
    sub r2, r1, r0 @ r2 = r1 - r0
    sub r1, r0  @ r1 -= r0
		.end 

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第12张图片
r0=2;r1=1;r2=r0-r1;pc=0x10

  _start:
	mov r0, #3
    mov r1, #2
    
    subs r2, r1, r0 @; r2 = r1 - r0, CPSR_NZCV = 运算结果过,借位C=0
		.end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第13张图片
r2 = r1 - r0, CPSR_NZCV = 运算结果过,借位CPRS的C=0。

  _start:
	 mov r0, #1
    mov r1, #3 @;被减数
    
    mov r2, #2
    mov r3, #1 @;减数
    
    subs r4, r0, r2
    sbc r5, r1, r3  @; r5 = r1 -r3 - !CPSR_C
    	 	.end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第14张图片

注意cprs的c、n两位。N = 符号位,0表示正数,1表示负数;C = 进位标志(针对无符号数,因为对于有符号来说进位等于溢出,但是溢出标志V有了)。
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第15张图片

  _start:
mov r0, #2
    mov r1, #3 
    mul r1, r0 @ r1 *= r0
	.end 

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第16张图片
r0=2;r1=3;r2=r1*r0=6;pc=0x0c.

	  _start:
	mov r0, #2
    mov r1, #3
    mov r3, #3
    mla r2, r1, r0, r3  @ r2 = r1 * r0 + r3
	.end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第17张图片
乘加: r2 = r1 * r0 + r3
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第18张图片

  _start:
	mov r0, #2
    rsb r1, r0, #3  @ r1 = 3 - r0
    rsc r2, r1, r0  @ r2 = r0 - r1 - !CPSR_C
     	.end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第19张图片
r1 = 3 - r0; r2 = r0 - r1 - !CPSR_C

(3)逻辑运算:and、orr、eor、bic
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第20张图片

 	  _start:
 	mov r0, #0xff
    and r0, #0xf0 @ r0 &= 0xf0
    
    mov r1, #0
    orr r1, #0xf0 @ r1 |= 0xf0
    
    mov r2, #0xf0
    eor r2, #0xf @ r0 ^= 0xf
      .end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第21张图片
r0 &= 0xf0 ;r1 |= 0xf0 ;r0 ^= 0xf .
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第22张图片

  _start:	
		mov r0, #0xff
    	bic r0, #0xf0 @ r0 = r0 & ~0xf0
	.end

ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第23张图片
(4)移位运算: lsl、lsr、asr、ror

  _start:
mov r0, #1
    lsl r0, #7  @ r0 = r0 << 7
    lsr r0, #7  @ r0 = r0 >> 7
    
    mov r0, #0x80000000
    asr r0, #7  @ signed int a; r0 = r0 >> 7
    
    mov r0, #0xf000000f
    ror r0, #28
       .end

(5) 比较运算:cmp、cmn
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第24张图片

  _start:
 	mov r0, #3
    mov r1, #6
    
    cmn r0, r1          @ cpsr_nzcv = r1 - r0
    cmp r0, r1          @ cpsr_nzcv = r0 - r1
	  .end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第25张图片
注意区分cmp与cmn的区别;
cmn r0, r1 @ cpsr_nzcv = r1 - r0
cmp r0, r1 @ cpsr_nzcv = r0 - r1
因为产生了负数,CPSE的·n为置为1.

(6)测试运算:tst、teq
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第26张图片

_start:
	mov r0, #0x7f
    tst r0, #0x80        @ CPSR_Z = r0 & 0x80
    
    mov r1, #0xff
    mov r2, #0xff
    teq r2, r1           @ cpsr_z = r2 ^ r1
	.end

底层现象:
ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第27张图片
当执行完mov r0, #0x7f
tst r0, #0x80
CPSR的 Z = 0标志位,为1表示结果为0,0表示结果不为0。显然z=1,表示 tst r0, #0x80 结果为0即r0 & 0x80结果为0

ARM汇编指令集——数据处理指令(如何从底层直接操纵CPU)_第28张图片
当执行完
mov r1, #0xff
mov r2, #0xff
teq r2, r1
CPSR的 Z = 0标志位,为1表示结果为0,0表示结果不为0。显然z=1,表示 teq r2, r1 为0,即r2 ^ r1为0

你可能感兴趣的:(ARM)