[原创]使用VMP指令模拟ARM条件跳转
0.目的:
在不直接使用BEQ BNE BLE... 仅使用NAND ADD... 的前提下,
模拟CPU对BXX条件码的判断,选择出跳转的分支地址。
1.ARM条件码判断原理:
决定指令是否执行的关键,是判断CPSR/FLAG寄存器的某BIT位为0还是为1。
[图片:760871_VZKEUYFPS2VMS5R.png]
以一段 ARM BLT指令为例:
---------------------------------------------------
...
.text:000007BC CMP R2, R3
.text:000007C0 BLT loc_798
.text:000007C4 LDR R3, =13688
---------------------------------------------------
(1)当CPSR的N位==V位,BLT loc_798不会执行,
程序将会执行到.text:000007C4 LDR R3, =13688。(简称分支A)
(2)当CPSR的N位!=V位,BLT loc_798将会执行,
程序将会跳转到偏移LOC_798处。(简称分支B)
2.模拟CPU实现BLT:
简单描述模拟的过程就是:
用ADD和AND,来手动计算出CPSR的N位和V位,
最后计算N-V根据结果,选择一个出一个分支地址。
详细过程:
(1)使用AND(CPSR,掩码)将CPSR中除N和V以外的比特位清零。
#define MASK_N 0x80000000 // 掩码 #define MASK_V 0x10000000 // 掩码 #define SHR_N 31-2 // 掩码需要右移的值(-2是因为得到数值4) #define SHR_V 28-2 // 掩码需要右移的值(-2是因为得到数值4)
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
