![](/img/trans.png)
[英]Multiply two 16 bit numbers and store 32 bit answer in dx:ax without mul instruction in assembly 8086
[英]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.