[英]Multiplying 64-bit number by a 32-bit number in 8086 asm
我一直遇到問題,甚至無法啟動解決方案。 我嘗試過考慮乘法是重復加法算法,但是無論我考慮哪種算法,我似乎都固定在一個問題上-8086中的最大寄存器大小為16位。
data segment
num1 dw 0102h,0304h,0506h,0708h
num2 dw 0102h,0304h
res dw ?,?,?,?,?,?
data ends
code segment
assume CS:CODE, DS:DATA
start:
mov ax,DATA
mov DS,ax
..........填寫代碼..........
在這一點上我被困住了。 即使是一小段代碼提示或僅算法,也將不勝感激。
使用16位CPU將64位數字乘以32位數字:
步驟1:假設數字在“ base 65536”中。 例如,一個64位數字的十六進制數為16位(例如0x0123456789ABCDEF
),而“基數65536”的位數為4位(例如{0123}{4567}{89AB}{CDEF}
); 並且以同樣的方式,“ base 65536”中的32位數字將有2位數字。
步驟2:要將一對數字相乘,請將第一個數字的每個數字乘以第二個數字的每個數字,然后將其添加到結果的正確位置。 正確的位置取決於原始數字中每個數字的位置。 例如,對於90 * 30(十進制),您將執行“ 9 * 3 = 27”並將其放在“百”位置(例如2700),因為第一個數字右邊有一個數字,而第一個數字右邊有一個數字。第二個數字右邊的數字,這意味着它需要轉到結果右邊第二個數字的位置。
例:
0x0123456789ABCDEF * 0x87654321
= {0123}{4567}{89AB}{CDEF} * {8765}{4321}
{0123}{4567}{89AB}{CDEF}
* {8765}{4321}
------------------------------------------
= {3600}{18CF} (from 4321 * CDEF)
+ {6CEA}{484B}{0000} (from 8765 * CDEF)
+ {2419}{800B}{0000} (from 4321 * 89AB)
+ {48CF}{7D77}{0000}{0000} (from 8765 * 89AB)
+ {1232}{E747}{0000}{0000} (from 4321 * 4567)
+ {24B4}{B2A3}{0000}{0000}{0000} (from 8765 * 4567)
+ {004C}{4E83}{0000}{0000}{0000} (from 4321 * 0123)
+ {0099}{E7CF}{0000}{0000}{0000}{0000} (from 8765 * 0123)
------------------------------------------
= {009A}{0CD0}{5C28}{F5C1}{FE56}{18CF}
------------------------------------------
= 0x009A0CD05C28F5C1FE5618CF
注意8086有一條“ 16位乘以16位= 32位結果”指令( MUL
); 通過使用一條ADD
指令以及隨后需要的許多ADC
指令,一次可將16位相加。
另請注意,您可以通過合並避免添加某些內容。 例如:
{0123}{4567}{89AB}{CDEF}
* {8765}{4321}
------------------------------------------
= {3600}{18CF} (from 4321 * CDEF)
+ {6CEA}{484B}{0000} (from 8765 * CDEF)
+ {2419}{800B}{0000} (from 4321 * 89AB)
+ {48CF}{7D77}{0000}{0000} (from 8765 * 89AB)
+ {1232}{E747}{0000}{0000} (from 4321 * 4567)
+ {24B4}{B2A3}{0000}{0000}{0000} (from 8765 * 4567)
+ {004C}{4E83}{0000}{0000}{0000} (from 4321 * 0123)
+ {0099}{E7CF}{0000}{0000}{0000}{0000} (from 8765 * 0123)
------------------------------------------
= {3600}{18CF} (from 4321 * CDEF)
+ {48CF}{7D77}{0000}{0000} (from 8765 * 89AB)
+ {0099}{E7CF}{0000}{0000}{0000}{0000} (from 8765 * 0123)
+ {6CEA}{484B}{0000} (from 8765 * CDEF)
+ {24B4}{B2A3}{0000}{0000}{0000} (from 8765 * 4567)
+ {2419}{800B}{0000} (from 4321 * 89AB)
+ {004C}{4E83}{0000}{0000}{0000} (from 4321 * 0123)
+ {1232}{E747}{0000}{0000} (from 4321 * 4567)
------------------------------------------
= {0099}{E7CF}{48CF}{7D77}{3600}{18CF} (THESE WERE MERGED WITHOUT ADDITION)
+ {24B4}{B2A3}{6CEA}{484B}{0000} (THESE WERE MERGED WITHOUT ADDITION)
+ {004C}{4E83}{2419}{800B}{0000} (THESE WERE MERGED WITHOUT ADDITION)
+ {1232}{E747}{0000}{0000} (from 4321 * 4567)
------------------------------------------
= {009A}{0CD0}{5C28}{F5C1}{FE56}{18CF}
------------------------------------------
= 0x009A0CD05C28F5C1FE5618CF
當然,因為對哪個順序進行乘法(“基數65536”)都是無關緊要的; 您可以按合並的最佳順序進行所有乘法。
對於最終代碼(合並); 您最終將獲得8條MUL
指令,3條ADD
指令和大約7條ADC
指令。 我懶得寫代碼。 ;)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.