簡體   English   中英

8086匯編:將兩個16位數字相乘以產生32位結果,而無需使用mul指令

[英]8086 Assembly: Multiply two 16 bit numbers to yield a 32 bit result without using the mul instruction

為了理解使用x86匯編語言的好處,我嘗試作為練習,編寫一個16x16位乘法例程,該例程接受兩個無符號的 16位值,並使用shift和* addin * g 它們相乘 ,並存儲最終的32位結果在DX:AX中

運行代碼沒有問題(換句話說,它可以很好地編譯並與我的鏈接程序一起運行),但是代碼沒有給出預期的乘法結果。

到目前為止,這是我想出的:


從理論上講,這應該給我DX:AX中無符號的32位結果。

當我在程序中使用此代碼時, 32位結果的低16位 (或AX部分)是正確的,並且顯示得很好。 32位結果(DX部分)的高16位 不正確

有人可以幫我弄清楚我做錯了什么嗎?

提前致謝

add bx, bx之后,似乎需要將被乘數的一部分移至另一個寄存器。 這是因為每次不移動進位而移動bx時,最高位都會被截斷。 因此,您的原始代碼僅將bx與ax相加的進位總和存儲在dx中,而不是乘法解決方案的上半部分。

在標簽AddToResult之后嘗試以下操作:

@AddToResult:
    add   bx,bx     ; add instead of shift?
    adc   di,di     ; shift part of multiplicand.
    or    cx,cx     ; fast zero check
    jnz   @lp

我還選擇了di作為被乘數的高16位,因為它已經被用於將進位加到解中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM