[英]ARMv7 Assembly Language : How to add two uint32_t and return a uint64_t result
我是一个修补ARM7汇编语言编程的初学者,一直坚持这个问题。
我试图在C中实现一个带有两个无符号32位变量(uint32_t A和uint32_t B)的函数,将它们加在一起然后返回一个uint64_t值,其中sum包含进位。
我在下面包含了我的C代码和ARM7汇编语言代码。 但是,我的代码没有输出正确的值; 这可能是由于我的ASM说明。 另外,我使用32位机器运行Linux。
addVal.s(下面的代码)
.global addVal
.text
addVal:
ADD R0, R0, R1
ADC R0, R1
BX LR
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;
}
使用命令行编译
as -o addVal addVal.o addVal.s
gcc -o addVal addVal_s.o addVal.c
./addVal
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.