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

ASM/NASM中MUL结果存入结构体异常:为何返回值全为0?

汇编乘法结果未写入结构体的问题解答

问题代码

NASM汇编实现

global mymul
mymul:
    mov rax, rdi
    mul rsi
    ret

C测试代码

#include <stdio.h>

typedef struct {
        unsigned long long high;
        unsigned long long low;
} resmul;

void mymul(unsigned long long, unsigned long long, resmul *res);

int main() {
    resmul res;

    mymul(3, 6, &res);
    printf("mymul(3, 6); res.high=0x%llx, res.low=0x%llx\n", res.high, res.low);
    //预期输出:mymul(3, 6); res.high=0x0, res.low=0x12
    return 0;
}

问题原因

你的汇编代码仅完成了乘法运算,完全没有将运算结果写入第三个参数指向的resmul结构体:

  • 按照x86-64 System V调用约定,第三个参数resmul *res存储在RDX寄存器中,指向目标结构体的内存地址
  • mul rsi执行后,结果高位确实在RDX、低位在RAX,但代码直接ret返回,没有对RDX指向的内存做任何写入操作,结构体的high和low字段始终是初始的0值

修正后的汇编代码

global mymul
mymul:
    mov rax, rdi        ; 将第一个乘数移入RAX,作为MUL的默认操作数
    mul rsi             ; 执行无符号乘法,结果高位存RDX,低位存RAX
    mov [rdx].high, rdx ; 将高位结果写入结构体的high字段
    mov [rdx].low, rax  ; 将低位结果写入结构体的low字段
    ret

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:01:17