前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ARM64下if语句的状态寄存器变化

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

原创
作者头像
Wilbur-L
修改2021-02-02 14:38:11
8810
修改2021-02-02 14:38:11
举报

一·代码

void fun(){

asm(

"mov w0,#0xffffffff\n"

"adds w0,w0,#0x0\n"

);

}

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

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

·正数+正数 为负数 溢出

·负数+负数 为正数 溢出

·正数+负数 不可能溢出

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一·代码
  • 二·CPSR寄存器
    • N位:
    • 三·内联汇编
      • Z位:
        • C位
          • 加法:
        • V位:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档