簡體   English   中英

裝配中的16位乘法?

[英]16-Bit Multiplication In Assembly?

所以我使用C ++和匯編來進行16位有符號乘法。

我知道對於16位,被乘數是AX,乘法器是寄存器或存儲器操作數16位,產品存儲在EDX:EAX中,它是操作數的兩倍。

我是初學者,所以我首先嘗試使用8位有符號乘法運算:

#include "stdafx.h"
#include <stdio.h>

int main()
{
    char X, Y;
    short Z;
    _asm
    {
        MOV X, 5
        MOV Y, 11

        MOV AL, X
        MOV BL, Y
        IMUL BL

        MOV Z, AX

    }

    printf("The result times is = %i", Z);



    getchar();
    //system("pause");
    return 0;
}

但我不確定為什么以下代碼不適用於16位。

#include "stdafx.h"
#include <stdio.h>

int main()
{
    short X, Y;
    int Z;
    _asm
    {
            MOV X, 5
            MOV Y, 11

            MOV AX, X
            MOV BX, Y
            IMUL BX

            MOV Z, [DX::AX]

    }

    printf("The result times is = %i", Z);



    getchar();
    //system("pause");
    return 0;
}

它不起作用的原因是指令MOV Z, [DX::AX]不存在。

你是正確的,結果將存儲在DX:AX中,但要將這兩個寄存器的結果存儲在一個內存位置,你必須做兩個存儲。

lea ecx,z        //load the address of z into cx
mov [ecx],ax     //8086 is little endian, so store the lower bytes first.
mov [ecx+2],dx   //store the high bytes 

我必須說看到16位匯編感到震驚。 386是在1985年推出的,所以你落后了大約30年。

將兩個16位值相乘的方法是:

movsx eax, word ptr x        //sign extension prevents partial register writes
movsx edx, word ptr y        //use movzx if you want to do an unsigned mul
imul eax,edx                 //multiply, but only store result in EAX.
mov z,eax                    //save result in one go.

在x86中使用16位寄存器會導致代碼速度非常慢,因為處理器未針對此操作模式進行優化。 有時16位代碼可能比普通代碼慢很多倍。
下面的代碼運行得比上面快得多。

  1. 它不會因部分寄存器寫入而受到停頓的影響。
  2. 它不對部分寄存器執行操作。
  3. 它不使用兩個寫入(其中一個是未對齊的),其中單個寫入就足夠了。

在最后一個例子中,您也不必了解小端的微妙之處。
您應該不惜一切代價避免使用16位寄存器。
等效的32位代碼幾乎總是快得多。
如果您無法將兩個16位寫入組合到一個32位中,則將16位值寫入內存是唯一的例外。

暫無
暫無

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

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