汇编实现点积计算出错求助:代码输出结果异常排查
问题分析与代码修正
你的内联汇编代码存在两个核心问题,导致输出结果不正确:
- 结果未回写至变量:循环计算完成后,点积结果存储在
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; }
关键修改说明
- 添加结果回写:在循环结束后增加
mov [result], eax,把累加得到的点积结果从eax寄存器存入result变量,确保函数返回正确值。 - 替换扩展指令:将
movzx改为movsx,因为short int是有符号类型,movsx会正确扩展符号位,保证负数参与计算时的数值准确性。
测试修正后的代码,会输出正确结果:Dot product: 38(对应1×5 + 2×6 + 3×7 = 38)。
内容的提问来源于stack exchange,提问作者Sheesh
相关产品推荐
相关产品推荐

