理解汇编语言的 mul 和 imul 指令的问题

2023-12-04

我正在学习80386保罗·考特的 PC 组装

  mul source
  • 如果操作数是字节大小,则将其乘以 AL 中的字节 注册和结果存储在 AX的16位.

fine.

  • 如果源是 16 位,则将其乘以 AX 中的字和 32 位结果存储在 DX:AX 中。

Q1:为什么是DX:AX?为什么不能存储在EAX/EDX中?

imul真的很混乱

imul dest, source1
imul dest, source1, source2

alt text

我在理解表格时遇到问题。

Q2:在表的第二项中。再说一次,为什么是 DX:AX。为什么不是 EAX 或 EDX?

现在考虑以下代码片段:

imul eax ; edx:eax = eax * eax
mov ebx, eax ; save answer in ebx
mov eax, square_msg ; square_msg db "Square of input is ", 0
call print_string ; prints the string eax
mov eax, ebx 
call print_int ;  prints the int stored in eax
call print_nl ; prints new line

Q3:其之前曾说过The notation EDX:EAX means to think of the EDX and EAX registers as one 64 bit register with the upper 32 bits in EDX and the lower bits in EAX.那么答案也存储在 edx 中,对吗?在上面的代码中我们没有考虑任何 EDX 我们只是指 EAX 这怎么还有效?

Q4:我对表中所有条目的其余部分都有疑问。两个 n 位数字(n = 8/16/32 位)的最坏情况乘法结果是 2n 位。为什么它会将两个16/32位乘法结果存储在本身大小相同的寄存器中?


imul 指令有许多不同的变体。

您偶然发现的变体是 16 位乘法。它将 AX 寄存器与作为参数传递给 imul 的任何内容相乘,并将结果存储在 DX:AX 中。

一种 32 位变体的工作方式类似于 16 位乘法,但将寄存器写入 EDX:EAX。要使用此变体,您只需使用 32 位源操作数即可。

E.g:

  ; a 16 bit multiplication:
  mov ax, [factor1]
  mov bx, [factor2]
  imul bx              ; 32-bit result in DX:AX
  ; or  imul  word [factor2]

  ; a 32 bit multiplication:
  mov eax, [factor1]
  mov ebx, [factor2] 
  imul ebx             ; 64-bit result in EDX:EAX

在 386 或更高版本上,您还可以编写imul以两个操作数的形式。这使得它更加灵活且更易于使用。在此变体中,您可以自由选择任意 2 个寄存器作为源和目标,CPU 不会浪费时间在任何地方写入高半结果。并且不会破坏 EDX。

  mov   ecx, [factor1]
  imul  ecx, [factor2]    ; result in ecx, no other registers affected
  imul  ecx, ecx          ; and square the result

或者使用有符号的 16 位输入来匹配您的imul。 (对无符号输入使用 movzx)

  movsx   ecx, word [factor1]
  movsx   eax, word [factor2]  ; sign-extend inputs to 32-bit
  imul    eax, ecx             ; 32-bit multiply, result in EAX
  imul    eax, eax             ; and square the result

imul 的这个变体是引入 386,并且有 16 位和 32 位操作数大小可供选择。 (以及 64 位模式下的 64 位操作数大小)。

在 32 位代码中,您始终可以假设 386 条指令,例如imul reg, reg/mem可用,但如果您不关心较旧的 CPU,则可以在 16 位代码中使用它。

186 引入了 3 操作数立即数形式。

imul  cx, bx, 123        ; requires 186

imul  ecx, ebx, 123      ; requires 386
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

理解汇编语言的 mul 和 imul 指令的问题 的相关文章

随机推荐