ARM64下if语句的状态寄存器变化

2021-02-02 14:38:11 浏览数 (1)

一·代码

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发生改变

cpsrcpsr

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位,溢出标志位。在进行有符号运算的时候,如果超过了机器所能识别的范围,称为溢出

·正数 正数 为负数 溢出

·负数 负数 为正数 溢出

·正数 负数 不可能溢出

0 人点赞