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

汇编实现点积计算出错求助:代码输出结果异常排查

问题分析与代码修正

你的内联汇编代码存在两个核心问题,导致输出结果不正确:

  • 结果未回写至变量:循环计算完成后,点积结果存储在eax寄存器中,但你没有将这个值写入result变量,函数返回的是未初始化的垃圾数据。
  • 有符号数处理错误:使用movzx(无符号零扩展)处理有符号的short int类型,若向量包含负数,会错误地将负数解析为正数,导致计算偏差。

修正后的完整代码

#include <iostream>
long DotProduct(short int* vec1, short int* vec2, int l)
{
long result;
_asm
{
    mov esi, [vec1]; 
    mov edi, [vec2]; 
    mov ecx, [l]; 
    xor eax, eax; 
loop_start:
    movsx edx, word ptr[esi];  // 用movsx做有符号扩展,适配short的负数场景
    imul edx, word ptr[edi]; 
    add eax, edx; 
    add esi, 2; 
    add edi, 2; 
    sub ecx, 1; 
    jnz loop_start; 
    mov [result], eax;  // 将寄存器中的结果写入result变量
}
return result;
}
int main() {
short int vec1[] = { 1, 2, 3 };
short int vec2[] = { 5, 6, 7 };
int l = 3;
long result = DotProduct(vec1, vec2, l);
std::cout << "Dot product: " << result << std::endl;
}

关键修改说明

  1. 添加结果回写:在循环结束后增加mov [result], eax,把累加得到的点积结果从eax寄存器存入result变量,确保函数返回正确值。
  2. 替换扩展指令:将movzx改为movsx,因为short int是有符号类型,movsx会正确扩展符号位,保证负数参与计算时的数值准确性。

测试修正后的代码,会输出正确结果:Dot product: 38(对应1×5 + 2×6 + 3×7 = 38)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 23:13:10