一·代码
void fun(){
asm(
"mov w0,#0xffffffffn"
"adds w0,w0,#0x0n"
);
}
二·CPSR寄存器
cpsr有32位,其中IFTM[0:4]称为控制位,程序无法改变,除非CPU运行在某种特殊的管理模式下。
N ,Z ,C ,V 为条件码标志位,四位内容可以被算术或逻辑运算的结果所改变,并且决定某条指令是否可以被执行。
31 30 29 28 27~8保留位 7~0IFTM位
N位:
CPSR的31位是N,记录相关指令执行后,其结果是否位负数。负数=1,非负数=0
此时a!=b N位应该是1000=8
那么cpsr=0x80000000
我们修改一下
三·内联汇编
对asm内联代码打断点可以发现
cpsr为0x6000000
对应NZCV为:0110
ARM64指令集中,有的指令执行时影响状态寄存器,比如add sub or等,他们大都是运算指令
Z位:
CPSR的第30位,0标志位。它记录相关指令执行后,其结果是否为0.那么Z=1
内联汇编代码中我们给w0赋值了0xffffffff
lldb单步执行下一步mov发现,CPSR的值没有发生改变
但是此时我的汇编代码是adds
再次单步执行
CPSR发生改变
C位
CPSR的第29位,进位标志位。一般情况下,进行无符号数的运算。
加法运算:当运算结果产生了进位时(无符号溢出),C=1否则C=0
减法运算(包括CMP):当运算时产生了借位时,无符号溢出,C=0否则C=1
加法:
mov w0,#0xaaaaaaaa 0xa的二进制是1010
adds w0,w0,w0 执行后1010 << 1 进位1 无符号溢出 C标记为1
adds w0,w0,w0 执行后0101 << 1 进位0 无符号没溢出 C标记为0
adds w0,w0,w0 重复
减法:
mov w0,#0x0
subs w0,w0,#0xff 计算0x100000000 - 0x000000ff 借位C标记为1
subs w0,w0,#0xff
subs w0,w0,#0xff
V位:
CPSR第28位,溢出标志位。在进行有符号运算的时候,如果超过了机器所能识别的范围,称为溢出
·正数 正数 为负数 溢出
·负数 负数 为正数 溢出
·正数 负数 不可能溢出