【问题标题】:How to split a 32-bit integer to two 16-bit half-words如何将一个 32 位整数拆分为两个 16 位半字
【发布时间】:2021-04-13 12:51:56
【问题描述】:

如何将一个 32 位十六进制数除以两个 16 位十六进制数并存储它们,使较低的在第一个寄存器中,较高的在第二个寄存器中。

例如,我有一个数据,例如 0xB0B0A0A0,我想在我的代码中提取 0xA0A0​​ 到 R0 和 0xB0B0 到 R1。

【问题讨论】:

  • 与使用任何其他语言的变量的方式相同。然后简单地将其翻译成另一种语言(asm)。关于指令、mov 等,您不了解 arm 文档的哪一部分?
  • 当你在 C 中实现它并编译它并检查输出时,那些指令你不明白怎么办?
  • 感谢您的回答@old_timer。我必须用汇编语言用基本命令对其进行编码,但我会试一试。
  • @fuz Texas Instruments TM4C129XNCZAD 微控制器
  • 第一个问题是您遇到算法问题还是编码算法问题?这就是为什么你用你知道的语言解决算法然后简单地将答案移植到新语言。如果您面前没有 arm 架构文档,请停止工作并获取它们。第二个问题是您使用的是哪个指令集 arm 不止一个,获取正确的文档并使用正确的指令集。第三,哪个工具看起来像keil,汇编是特定于工具而不是指令集。您在上面回答的另一个问题是您找到输入的形式是什么...

标签: assembly arm bit-fields


【解决方案1】:

在足够现代的 ARM 芯片上,您可以为此目的使用 uxth(无符号扩展半字)指令:

@ assuming R2 = 0xb0b0a0a0
uxth r0, r2, ror #0    @ r0 = 0x0000a0a0
uxth r1, r2, ror #16   @ r1 = 0x0000b0b0

详情请参阅ARMv7-M ARM Architecture Reference Manual。

如果为 ARMv6-M 目标编程或在 Thumb 上优化代码大小,则可以将第二条指令替换为 lsrs 以减少代码大小:

lsrs r1, r2, #16       @ r1 = 0x0000b0b0

但请注意,这会导致 NZCV 被修改。

【讨论】:

  • 感谢您的回答。它帮助很大。
  • @coffeeattpk 如果答案解决了您的问题,请确保通过单击绿色复选标记将答案标记为已接受。
  • 我们不应该简单地为他们做功课,尽管这工作的地方有限可能会影响作业。
  • 是的,完全正确...编译器为其中至少一个提供了 uxth,一个简单的 lsr...16 将覆盖另一个,因此 uxth 可能是他们使用编译器的触发器。 ..两个 uxth 是他们没有的触发器...
  • 好吧。下次如果我要在作业中使用它,我会说清楚。再次感谢所有帮助过我的人。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 2023-03-05
相关资源
最近更新 更多