【发布时间】:2016-12-07 16:14:02
【问题描述】:
我试图了解在汇编器中使用“mul”操作数的逻辑(我正在使用 Visual Studio Community 和 MASM)。 为什么,在“mul ebx”之后结果也在改变edx,而不仅仅是eax? “MUL 的结果存储在寄存器 AX、寄存器对 DX:AX 或寄存器对 EDX:EAX 中(取决于操作数大小),乘积的高位包含在寄存器 AH、DX 或EDX”。 那么位置是否取决于操作数的大小?在哪种情况下?
.586
.model flat,c
.stack 100h
.data
.code
doit proc
;EAX = 0062EEF0 EBX = 7EFDE000 ECX = 0029FD00 EDX = 00000000
mov eax,8;
;EAX = 00000008
mov ebx,4
;EBX = 00000004
mov edx,23498
;EDX = 00005BCA
mul ebx
;EAX = 00000020 EDX = 00000000 ???? 4*8 =20(hexa).So, there is no
;overflow;why is edx changing too?
doit endp
end
【问题讨论】:
-
目的地不同的原因是涉及的位数,两个8位操作数需要16位结果,所以16位寄存器AX,16位x 16位需要32位结果,所以DX:AX 的 32 位,32 位 x 32 位的结果需要 64 位,因此 EDX:EAX 中的 64 位
-
EDX 发生了变化,因为没有涉及溢出概念。这些位是结果的一部分,即使你做了零次零
标签: visual-studio assembly x86 masm