x86汇编嵌入计算x*(y+2)出错求助(Visual Studio编译器)
汇编计算x*(y+2)结果错误的原因及修复
核心错误点
16位乘法结果截断
你使用imul bx执行16位有符号乘法时,乘积结果是32位(高16位存在dx,低16位存在ax),但代码只将ax存入v_as,丢失了dx中的高16位数据,导致结果和C语言的完整计算结果不符。数据类型提升不匹配
C语言中计算x*(y+2)时,char类型的x和short类型的y+2会自动提升为int(32位),乘法是32位运算,不会出现截断;而你的汇编代码用16位寄存器运算,无法容纳完整的乘积值。变量类型定义错误
v_as被定义为short int,但C中x*(y+2)的结果是int(32位),即使汇编计算出完整结果,存入short变量也会被截断为16位,导致结果错误。
修复后的代码
首先修改变量类型:
// 将v_as改为int类型,匹配C的计算结果类型 int v_as;
然后调整汇编代码,使用32位运算匹配C的类型提升逻辑:
_asm { // 符号扩展y到32位寄存器eax,计算y+2 movsx eax, y add eax, 2 // 符号扩展x到32位寄存器ebx movsx ebx, x // 32位乘法,结果存入eax(乘积在int范围内) imul ebx // 将完整结果存入v_as mov v_as, eax }
额外说明
你printf中的注释x=bh, y=-3h和代码里的实际赋值x=0x72, y=-0x78AC不符,这是输出描述的笔误,不影响计算,但建议修正以避免混淆。
内容的提问来源于stack exchange,提问作者Tsygaika
相关产品推荐
相关产品推荐

