ARMv7 汇编语言:如何添加两个 uint32_t 并返回一个 uint64_t 结果

Sam*_*m T 5 c assembly arm

我是一名修补 ARM7 汇编语言编程的初学者,一直被困在这个问题上。

我正在尝试在 C 中实现一个函数,该函数采用两个无符号 32 位变量(uint32_t A 和 uint32_t B),将它们相加,然后返回一个 uint64_t 值,其中总和包含进位。

我在下面包含了我的 C 代码和 ARM7 汇编语言代码。但是,我的代码没有输出正确的值;这可能是由于我的 ASM 指令。另外,我在 32 位机器上运行 Linux。

addVal.s(下面的代码)

.global addVal 

.text

addVal:
    ADD R0, R0, R1
    ADC R0, R1 
    BX LR
Run Code Online (Sandbox Code Playgroud)

addVal.c(下面的代码)

#include <stdio.h>
#include <stdint.h>

extern uint64_t addVal(uint32_t x, uint32_t y);

int main()
{
  uint32_t a, b;
  uint64_t c;
  a = 4000000000;
  b = 1000000000;
  c = addVal(a,b);
  printf("a = %u\r\n", a);
  printf("b = %u\r\n", b);
  printf("c = a + b = %llu\r\n", c);
  return 0;

}
Run Code Online (Sandbox Code Playgroud)

使用命令行编译

as -o addVal addVal.o addVal.s
gcc -o addVal addVal_s.o addVal.c
./addVal
Run Code Online (Sandbox Code Playgroud)

Ext*_*t3h 4

ADC R0, R1是错的。

uint64_t超过单个寄存器的大小时,它会扩展到后续的寄存器范围。低位字位于R0,高位字位于R1。所以目标寄存器ADC需要是R1.

第二个问题是您不想将原始低位字添加R1到结果高位字中,而只想将进位位添加到结果高位字中。所以你可以R1先清除一下。

.text
.arm
.global addVal 
.func addVal
addVal:
    ADDS R0, R0, R1
    MOV R1, #0
    ADC R1, R1, #0
    BX LR
Run Code Online (Sandbox Code Playgroud)