assembly - 在 Thumb 模式下将寄存器符号扩展为 64 位(设置所有位 = 符号位)
问题描述
我正在为 ARM7TDMI(ARMv4T 架构)使用汇编程序。我正在使用 Thumb 模式,因为 ROM 具有 16 位总线 (GBA)。我想对一个 32 位寄存器进行符号扩展,以获取另一个寄存器,其中所有位都设置为源寄存器第 31 位的副本。符号扩展的寄存器是一个高位寄存器,特别是 R9。
我目前正在使用这个:
mov r0,r9
mvn r0,r0 @ sign bit needs to be inverted due to
@ the silly ARM carry convention
add r0,r0 @ copy sign bit to carry
sbc r0,r0 @ sign-extend R9
但这需要 4 条指令。有没有更短的方法?
解决方案
使用算术右移 31 或 32 将符号位复制为-1
或复制0
到新寄存器中:
mov r1, r9 @ move to a low register to be usable as an operand
asrs r0, r1, #31 @ generate -1 or 0 in R0 depending on sign of R1
推荐阅读
- elasticsearch - Kibana {"statusCode":403,"error":"Forbidden","message":"Forbidden"}
- javascript - 为什么递归函数中特别需要“null”?
- javascript - jQuery按钮切换文本在onlick上不起作用
- python - 如何在 Python 中将嵌套字典的值与不同数量的键相乘?
- .net - ML.NET:如何解决“具有角色 MatrixColumnIndex 的列应该是已知的基数 U4 键,而是 'UInt32'”
- java - FileInputStream 读取方法不断返回 194
- django - celery 找不到活动任务(本地和 Heroku)
- javascript - React Native Expo 应用程序中的 RefreshView 超时
- ios - 制作动画以滑动和隐藏/显示 UIView(swift 5)
- ios - 如何在 Tableview 中实现 Presets 节省