指令:
编译完成后作为一条指令存放在内存单元中,在CPU执行时完成一定的操作。
_start:
mov r0, #1 @;搬移有效数
mov r1, r0 @;寄存器之间数据搬移
.end
备注:
立即数:0-255之间的数
有效数:
1、本身就在0-255之间的数
2、循环右移偶数位能够得到0-255之间的数
3、能够通过按位取反得到0-255之间的数
4、能够通过按位取反,取反后的值通过循环右移偶数位得到0-255之间的数
底层现象:
运行程序之后的现象:把1放入r0中,再把r0中的数放入r1中。程序计数器(PC)的作用是存放处理器要读取的下一条指令的地址,一条指令占四个字节,故此时执行了两条指令,pc的值为8。
_start:
mvn r1, #0xff000000
.end
底层现象:
运行程序之后的现象:将目标数取反放入r1,pc置4.
(2)算术运算:add、adc、sub、sbc、rsb、rsc、mul、mla
_start:
mov r0, #2
mov r1, #3
add r2, r1, #3 @ r2 = r1 + 3
add r1, #3 @ r1 += 3
.end
底层现象:
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 = 处理器工作状态
底层现象:
相加后产生进位
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
_start:
mov r0, #2
mov r1, #3
sub r2, r1, r0 @ r2 = r1 - r0
sub r1, r0 @ r1 -= r0
.end
底层现象:
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
底层现象:
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
注意cprs的c、n两位。N = 符号位,0表示正数,1表示负数;C = 进位标志(针对无符号数,因为对于有符号来说进位等于溢出,但是溢出标志V有了)。
_start:
mov r0, #2
mov r1, #3
mul r1, r0 @ r1 *= r0
.end
底层现象:
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
_start:
mov r0, #2
rsb r1, r0, #3 @ r1 = 3 - r0
rsc r2, r1, r0 @ r2 = r0 - r1 - !CPSR_C
.end
底层现象:
r1 = 3 - r0; r2 = r0 - r1 - !CPSR_C
_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
底层现象:
r0 &= 0xf0 ;r1 |= 0xf0 ;r0 ^= 0xf .
_start:
mov r0, #0xff
bic r0, #0xf0 @ r0 = r0 & ~0xf0
.end
_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
_start:
mov r0, #3
mov r1, #6
cmn r0, r1 @ cpsr_nzcv = r1 - r0
cmp r0, r1 @ cpsr_nzcv = r0 - r1
.end
底层现象:
注意区分cmp与cmn的区别;
cmn r0, r1 @ cpsr_nzcv = r1 - r0
cmp r0, r1 @ cpsr_nzcv = r0 - r1
因为产生了负数,CPSE的·n为置为1.
_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
底层现象:
当执行完mov r0, #0x7f
tst r0, #0x80
CPSR的 Z = 0标志位,为1表示结果为0,0表示结果不为0。显然z=1,表示 tst r0, #0x80 结果为0即r0 & 0x80结果为0
当执行完
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