【问题标题】:How load a 64 bit number in a 32 bit arm processor?如何在 32 位 arm 处理器中加载 64 位数字?
【发布时间】:2021-01-31 05:59:57
【问题描述】:

我正在尝试在 32 位 ARM7TDMI-S 微处理器上加载 64 位数字,但是我不知道如何执行此操作。我知道 MOV 和 LDR 都只存储 32 位数字,所以有什么办法可以将 2 个 32 位寄存器用作一个 64 位寄存器?

【问题讨论】:

  • 我的意思是,您将一半加载到一个寄存器中,将另一半加载到另一个寄存器中。您不能“使用”两个 32 位寄存器作为单个 64 位寄存器,但无论您实际上想要对数字做什么,都会有办法做到这一点。你想做什么?
  • LDM 可以一次加载两个寄存器,但是没有 ALU 指令可以对一对整数寄存器进行加法运算,因此您通常必须 add/adc。查看简单的int64_t 函数的编译器输出 (godbolt.org) 如果您有 NEON,您当然可以将 64 位加载到诸如d0 之类的寄存器中。我不知道 NEON 是否对 64 位元素的移位/添加/任何内容有很多支持,但您至少可以 AND 或其他不关心元素宽度的按位布尔运算。
  • @NateEldredge 我只想加载 2 个 64 位数字并添加它们。所以正如你所说,我应该编写我的汇编代码,这样当我添加 2 个数字时,它会反映在两个 32 位寄存器上,或者是否有任何指令可以做到这一点。
  • @PeterCordes 问题是我已指示使用 MOV 加载寄存器

标签: assembly arm arm7


【解决方案1】:

问编译器它会告诉你的。显然你不能将 64 位放入 32 中,它需要两个寄存器。

unsigned long long fun ( unsigned long long a, unsigned long long b )
{
    return(a+b);
}

00000000 <fun>:
   0: e0900002 adds r0, r0, r2
   4: e0a11003 adc r1, r1, r3
   8: e12fff1e bx lr

【讨论】:

    【解决方案2】:

    好的,我得到了我自己问题的答案。我必须将数字的下半部分加载到一个寄存器中,将上半部分加载到另一个寄存器中。如果我们想将这两个数字相加,那么我们使用ADDS 来添加下半部分,使用ADC 来添加上半部分。

    【讨论】:

    • 如果你不能用一个寄存器做,那就用两个做。如果你不能用两个使用更多,或者使用内存。
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2014-05-27
    • 2011-04-19
    • 2020-12-26
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    相关资源
    最近更新 更多