首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ARMv7汇编语言:如何添加两个uint32_t并返回uint64_t结果

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

Stack Overflow用户
提问于 2019-03-01 04:40:56
回答 1查看 2.1K关注 0票数 5

我是一个初学者,对ARM7汇编语言编程进行修补,并且一直被困在这个问题上。

我试图在C中实现一个函数,它使用两个无符号32位vars (uint32_t A和uint32_t B),将它们相加在一起,然后返回一个uint64_t值,其中和包含进位。

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

addVal.s (代码如下)

代码语言:javascript
复制
.global addVal 

.text

addVal:
    ADD R0, R0, R1
    ADC R0, R1 
    BX LR

addVal.c (代码如下)

代码语言:javascript
复制
#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;

}

在命令行上使用

代码语言:javascript
复制
as -o addVal addVal.o addVal.s
gcc -o addVal addVal_s.o addVal.c
./addVal
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 06:31:08

ADC R0, R1错了。

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

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

代码语言:javascript
复制
.text
.arm
.global addVal 
.func addVal
addVal:
    ADDS R0, R0, R1
    MOV R1, #0
    ADC R1, R1, #0
    BX LR
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54938045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档