0

キャリーでもうまくいく3つの数字を掛けています。学習目的で乗算する4番目の数値を追加したいと思います。

3つの数値を掛けた後、EDXにシフトして印刷します。よく働く。4番目の数値を追加した後、32ビットx 32ビットを乗算していると思いますか?それで、EDX:EAXに保存しますか?

次に、EAXをEDXにシフトして、一緒に印刷できるようにする必要がありますか?私は4番目の数字のためにそれを正しくやっているかどうかわかりませんか?

.data?
  num1 dd ?
  num2 dd ?
  num3 dd ?
  num4 dd ?

.data
sum dd 0
prod dd 0
prod2 dd 0

ここにプロンプ​​トがあります

mov EAX, sval(input("Enter first number: "))
mov num1, EAX
mov EAX, sval(input("Enter second number: "))
mov num2, EAX
mov EAX, sval(input("Enter third number: "))
mov num3, EAX

mov EAX, sval(input("Enter fourth number: "))
mov num4, EAX

これがロジックです

mov EAX, num1
mov EBX, num2
mul BL                 ; 8 bit x 8 bit ----> AX / 16bit

mov EBX, num3
mul BX     ; 16bit x 16bit --->DX:AX

shl EDX, 16  ; shift low to high             ;high / low in EDX
mov DX, AX     ; mov in all reg

mov ECX, num4   ; 32bit x 32bit ---> EDX:EAX
mul CX
mov prod2, EAX  ; for printing

num4をECXに移動してCXで乗算する必要があるかどうかわかりませんが、代わりに32ビットで乗算する必要がありますか?4番目の数字で何が間違っているのですか?ありがとうございました

4

1 に答える 1

0

32ビット乗算はEAXレジスタを使用します。MULオペランドは16ビットレジスタを使用するため、3番目の乗算のコードは16ビットです。したがって、乗算はAX x CXです。32ビット乗算には32ビットオペランドが必要なため、コードでは、ECXではなくを使用する必要がありますCX。また、値はまだEDXレジスタに配置されているため、32ビット乗算の準備は不完全です。

したがって、コードは次のようになります。

mov EAX, num1
mov EBX, num2
mul BL         ; 8 bit x 8 bit ---> AX / 16bit

mov EBX, num3
mul BX         ; 16bit x 16bit ---> DX:AX

shl EDX, 16    ; shift low to high  ;high / low in EDX
mov DX, AX     ; mov in all reg
mov EAX, EDX   ; prepare EAX for 32bit x32bit

mov ECX, num4
mul ECX        ; 32bit x 32bit ---> EAX x ECX ---> EDX:EAX
mov prod2, EAX ; for printing

32ビットの乗算は64ビットの値になる可能性があることに注意してください。そのため、印刷機能でレジスタが考慮されてEDX:EAXいることを確認してください。EDX

于 2012-07-18T00:30:49.323 に答える