找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5196018|回复: 0

android逆向状态寄存器

[复制链接]

该用户从未签到

发表于 2021-5-23 04:13:20 | 显示全部楼层 |阅读模式

您需要 登录 才可以下载或查看,没有账号?立即注册

×
程序状态寄存器共分为两种,它们的位数都是 32 位:
[list,
[*,1 个 CPSR:当前程序状态寄存器(current program status register),可以在任何工作模式下被访问。
[*,5 个 SPSR:保持程序状态寄存器(saved program status register),只有在异常模式下,才能被访问;各异常模式拥有自己的 SPSR。发生异常时,SPSR 保存 CPSR 的值,格式同 CPSR。
[/list,它们 32 位的含义分别如下:
[list,
[*,条件码标志( The condition code flags):5 个。N 符号标志,Z 零标志,C 进位标志,V 溢出标志,Q DSP 运算溢出标志。
[*,控制位(The control bits):4 个。I IRQ 标志,F FIQ 标志,T 状态位,M[4:0] 模式位。
图中的 DNM 是 Do Not Modify,表示不同版本、处理器的含义不同。

此图来自 http://blog.csdn.net/u014132720/article/details/52088485。不知道他看的哪本英文书,我看的没他这个详细,因此拿来一用。
[/list,条件码的具体含义:
标志位含义N当用两个补码表示的带符号数进行运算时。
N=1:运算结果为负数 。
N=0:运算结果为正数或零ZZ=1:运算结果为 0。
Z=0:运算结果不为 0C可以有四种方法设置 C 的值:
[list,
[*,加法运算(包括比较指令 CNM):C=1:运算结果产生了进位时(无符号数溢出)。C=0:运算结果没有进位
[*,减法运算(包括比较指令 CMP):C=0:运算时产生了借位(无符号数溢出)。C=1:没有借位
[*,对于包含移位操作的非加 / 减法运算指令,C 为移出值的最后一位
[*,对于其他的非加 / 减法 运算指令,C 的值通常不变
[/list,V可以有两种方法设置 V 的值:
[list,
[*,对于加 / 减法运算指令,当操作数和运算结果为二进制的补码表示的有符号数时,V=1 表示符号位溢出
[*,对于其他的非加 / 减法 运算指令,V 的值通常不改变
[/list,Q在 ARM v5 及以上版本的 E 系列处理器中,用 Q 标志位指示增强的 DSP 运算指令是否发生了溢出。在其它版本的处理器中,Q 标志位无定义。至于这些值都是怎么得来的呢?看下面的讲解:

首先我们有上面这幅图,其中 D7-D0 代表数据位,共一个字节。其上的 C7-C0 则代表向前进位的值。(也可以表示借位,这是箭头就要反过来了)
因此我们可以用 D7-D0 和 C7-C0 来表示条件码 N, Z, C, V:
[list,
[*,N=D7
[*,C=C7
[*,Z=D 7 ∨ D 6... D 1 ∨ D 0 ‾ \overline{D7\lor D6...D1\lor D0}D7∨D6...D1∨D0
[*,V=C 6 ⊕ C 7 C6\oplus C7C6⊕C7 (两个进位进行异或)
[/list,更多解释:
C 用来判断无符号数计算是否溢出。
V 用来判断有符号数计算是否溢出 。
具体看哪个根据你计算时把数据当成有符号位还是无符号位。
控制位代表啥含义不是我撰写的本文重点,故此不提。
回复

使用道具 举报

网站地图|页面地图|文字地图|Archiver|手机版|小黑屋|找资源 |网站地图

GMT+8, 2024-11-7 12:34

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表