You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM汇编实现两个uint32_t相加返回uint64_t结果异常排查

问题原因分析
  • 核心错误是不符合ARM 32位架构的AAPCS标准调用约定:两个uint32_t类型的输入参数,按顺序存放在R0、R1寄存器,你代码中使用的R2、R3存储的是未初始化的脏数据,相加后自然会得到数值异常的错误结果。
  • 其次是返回值构造逻辑错误:32位环境下uint64_t类型的返回值由R0(存储低32位)和R1(存储高32位)拼接组成,两个32位无符号数相加的高32位仅来自加法产生的进位位,你直接用入参值R1参与带进位加法,完全不符合计算逻辑。
正确实现代码
; 入参约定:R0 = uint32_t A,R1 = uint32_t B
; 返回约定:R0存储结果低32位,R1存储结果高32位,二者拼接为uint64_t类型的和
ADDS    R0, R0, R1      ; 计算A+B的低32位,同时更新CPSR寄存器的进位标志
MOV     R1, #0          ; 初始化返回值的高32位为0
ADC     R1, R1, #0      ; 将加法产生的进位存入返回值的高32位
BX      LR              ; 函数返回
验证示例

当输入A=0xFFFFFFFF、B=1时,上述代码运行后R0=0x00000000、R1=0x00000001,拼接得到的64位结果为0x100000000,符合无符号加法的预期结果。

内容的提问来源于stack exchange,提问作者Wesley Hendriks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 18:36:05