簡體   English   中英

ARMv7匯編語言:如何添加兩個uint32_t並返回uint64_t結果

[英]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超過單個寄存器的大小,因此它會擴展到后續的寄存器范圍。 低字位於R0R1高字。 因此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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM