簡體   English   中英

在8086 ASM中將64位數字乘以32位數字

[英]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.

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