Assembly X86程序集mul错误masm

Assembly X86程序集mul错误masm,assembly,x86,masm,Assembly,X86,Masm,一个简单的问题,为什么这不起作用: mov ebx,m[edx*4] mov eax,conv[edx*4] mul ebx 我选中了m[edx*4]它有两个(应该有什么)相同的conv[edx*4] 它基本上只是一个2*3 m和conv是dd 2500 dup(?)我尝试如下: 检查内存位置m和conv的32位值 启动mov ebx时,edx的值是多少,m[edx*4] 检查ebx和eax中的预期值是否正确 Edx将被覆盖,因为MUL和IMUL指令将结果存储在Edx和

一个简单的问题,为什么这不起作用:

    mov ebx,m[edx*4]
    mov eax,conv[edx*4]
    mul ebx
我选中了
m[edx*4]
它有两个(应该有什么)相同的
conv[edx*4]

它基本上只是一个
2*3

m
conv
dd 2500 dup(?)
我尝试如下: 检查内存位置m和conv的32位值 启动mov ebx时,edx的值是多少,m[edx*4] 检查ebx和eax中的预期值是否正确 Edx将被覆盖,因为MUL和IMUL指令将结果存储在Edx和EAX中

MUL用于无符号乘法,IMUL用于有符号乘法。这意味着,与Jester所说的相反:对于32位操作数,使用MUL(无符号),对于第32位有符号的31位,使用IMUL

如果这一切都正常,那么如果m[edx*4]=2和conv[edx*4]=3(反之亦然),您应该在edx=0和eax=6中 请注意,conv和m是32位,最低有效字节位于最低内存位置


如果我错了,请纠正我。

您知道EDX将被此乘法指令覆盖
mul ebx
?@Michael Petch,嗯,不,为什么?编辑。。等待,即使EDX不用于存储结果,它仍然被覆盖?请参阅
mul
指令:32位无符号整数*32位无符号整数将被放入EDX和EAX寄存器中的64位值中。EDX将具有结果的高32位,EAX将具有结果的低32位。使用EBX(而不是EDX)作为数组索引,使用EDX(而不是EBX)保存右操作数更有意义。因为后者被MUL覆盖是没有问题的。明智地选择寄存器。如果需要32位乘法,请使用双操作数
IMUL r32,r/m32
指令。