Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 带masm的寄存器edx::eax中的mul和内存分配_Visual Studio_Assembly_X86_Masm - Fatal编程技术网

Visual studio 带masm的寄存器edx::eax中的mul和内存分配

Visual studio 带masm的寄存器edx::eax中的mul和内存分配,visual-studio,assembly,x86,masm,Visual Studio,Assembly,X86,Masm,我试图理解在汇编程序中使用“mul”操作数的逻辑(我使用的是visualstudio社区和MASM)。 为什么在“mul ebx”之后,结果也在改变edx,而不仅仅是eax? “结果(MUL)存储在寄存器AX、寄存器对DX:AX或寄存器对EDX:EAX(取决于操作数大小)中,乘积的高阶位包含在寄存器AH、DX或EDX中。”。 那么位置取决于操作数的大小吗?在这种情况下 .586 .model flat,c .stack 100h .data .code doit proc

我试图理解在汇编程序中使用“mul”操作数的逻辑(我使用的是visualstudio社区和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 

是的,正如您所说,它取决于操作数大小,而不是操作数的实际值。您总是得到两倍大小的输出,溢出与否
mul ebx
为32位,因此在
edx:eax
中可以获得64位输出,其中
edx
可能为零


正如Peter Cordes指出的,如果您知道不需要结果的上半部分,“您可以而且应该使用IMUL的2操作数或3操作数立即数形式”。请不要被符号性所愚弄,引用指令集参考:“两个和三个操作数形式也可以用于无符号操作数,因为不管操作数是有符号的还是无符号的,乘积的下半部分都是相同的。”

是的,正如您所说,它取决于操作数大小,而不是操作数的实际值。您总是得到两倍大小的输出,溢出与否
mul ebx
为32位,因此在
edx:eax
中可以获得64位输出,其中
edx
可能为零

正如Peter Cordes指出的,如果您知道不需要结果的上半部分,“您可以而且应该使用IMUL的2操作数或3操作数立即数形式”。请不要被有符号性所愚弄,引用指令集参考:“两个和三个操作数形式也可以用于无符号操作数,因为不管操作数是有符号的还是无符号的,乘积的下半部分都是相同的。”

无符号乘法(指令)总是有符号扩展的(好的,零扩展,因为它是无符号的)当传递一个
r/m32
大小的操作数时,将其扩展到
EDX
,而不管
EDX
是否包含除零以外的任何内容

这也适用于有符号变量,尽管在这种情况下,如果结果为负数,
EDX
可能只包含
FF
字节。

无符号乘法(指令)将始终进行符号扩展(好吧,零扩展,因为它是无符号的)当传递一个大小为
r/m32
的操作数时,无论
EDX
是否包含除零以外的任何内容,它都会进入
EDX


这也适用于有符号变量,尽管在这种情况下,如果结果为负,
EDX
可能只包含
FF
字节。

MUL和
IMUL
指令总是生成两倍于输入宽度的输出。因此:

  • 8位输入(AL中一个)提供16位输出(AX中)
  • 16位输入(AX中的一个)提供32位输出(DX:AX)
  • 32位输入(EAX中的一个)提供64位输出(EDX中:EAX)

请注意,相关宽度始终是参数的宽度(以及隐式寄存器的宽度),而不是保存任何一个值的最小宽度。32位乘以零将(缓慢地)将EDX:EAX设置为全零。

MUL和IMUL指令始终生成两倍于输入宽度的输出。因此:

  • 8位输入(AL中一个)提供16位输出(AX中)
  • 16位输入(AX中的一个)提供32位输出(DX:AX)
  • 32位输入(EAX中的一个)提供64位输出(EDX中:EAX)

请注意,相关宽度始终是参数的宽度(以及隐式寄存器的宽度),而不是保存任何一个值的最小宽度。32位乘以零将(缓慢地)将EDX:EAX设置为全零。

不同目的地的原因是所涉及的位数,两个8位操作数需要16位结果,因此16位寄存器AX,16位x16位需要32位结果,因此DX:AX的32位需要64位结果,因此EDX中的64位:EAXYU可以认为是produ对AH:AL中的一对低/高输出进行计数。但是,如果不需要结果的高半部,则可以并且应该使用2操作数或3操作数立即数形式。EDX已更改,因为不涉及溢出概念。这些位是结果的一部分,即使您执行了零乘以零的操作,但不同目的地的原因是数字所涉及的位的r,两个8位操作数需要16位的结果,因此16位寄存器AX,16位x16位需要32位的结果,因此DX:AX的32位,32位x2位需要64位的结果,因此EDX:eaxy中的64位可以认为是在AH:AL中生成一对低/高输出。如果不需要尽管如此,您可以也应该使用2操作数或3操作数立即数形式的。EDX已更改,因为没有涉及溢出概念。这些位是结果的一部分,即使您执行了零乘以零术语:它不是EDX的符号或零扩展。它是结果的上半部分,可能是也可能不是零扩展下半部分的零扩展,取决于结果的大小。术语:它不是EDX的符号或零扩展。它是结果的上半部分,可能是也可能不是下半部分的零扩展,取决于结果的大小。使用16位输入(AX中的一个),32位的输出将是DX:AX而不是EAX。哦!当然。16位MUL早于EAX,一旦引入EAX,更改MUL就太晚了。谢谢!使用16位输入(AX中的一个),32位输出将是DX:AX而不是EAX。哦!当然。16位MUL早于EAX,一旦引入EAX,更改MUL就太晚了。谢谢!