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

GAS汇编中双大数加法结果错误问题排查

问题描述

我在GAS中实现两个大整数相加,先通过在线大整数计算器得到正确结果为-396,154,063,093,444,159,558。使用SASM汇编IDE调试时,rcx的结果为0x86420a87db9357ba,rdx的结果为0xffffffffffffffea,组合后得到的十进制数为340282366920938463067220544338324051898,与正确结果不符。以下是我的代码:

.section .data
bignum1:
    .octa -198077031546722079779 
bignum2:
    .octa -198077031546722079779
.text
.global main
main:
    movq %rsp, %rbp #for correct debugging
    # write your code here
    movq bignum1, %rax
    movq bignum1 +8, %rbx
    movq bignum2, %rcx
    movq bignum2 + 8, %rdx
    
    addq %rax, %rcx
    adcq %rbx, %rdx    
    
    movq $60, %rax
    syscall

请问我哪里出错了?

问题分析与解决

你的问题出在大整数结果的符号解读错误,代码本身的加法逻辑是正确的,具体细节如下:

  1. .octa的存储与读取逻辑
    .octa会将负数以16字节补码形式存储,x86_64是小端架构,你用movq分别读取低8字节和高8字节的操作没有问题,符合128位整数的拆分方式。

  2. 结果的正确解读方式
    调试得到的rdx = 0xffffffffffffffea,其最高位为1,说明这是一个128位补码表示的负数。将rdx:rcx视为带符号的128位整数转换为十进制,结果就是正确的-396154063093444159558。你之前错误地将rdx和rcx拼接成无符号数计算,才得到了不符合预期的正数结果。

  3. 补码验证
    可以通过补码转原码验证:将rdx:rcx取反加1,得到无符号绝对值的高64位0x0000000000000015、低64位0x15bdf578246ca846,组合后的值为396154063093444159558,加上负号就是目标结果。

你的加法逻辑(addq加低64位、adcq带进位加高64位)完全符合128位整数加法的要求,无需修改代码,只需要正确解读带符号128位整数的结果即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:32:47