所以我使用C++與程序集來執行16位有符號乘法。裝配中的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]'_MASM_語法無效。如果您確定要用16位寄存器對16位寄存器進行有符號乘法運算並得到DX:AX,那麼您將不得不用'MOV Z,[DX :: AX]'替換類似於'MOV字ptr [Z],AX''MOV字ptr [Z + 2],DX'。我假設'int'是一個32位有符號整數。您必須手動將AX和DX移動到變量Z中。如果你有32位寄存器可用,那麼你可以簡化代碼。 –
我想基本上只使用16位整數作爲x和y並將它們相乘。將存儲在DX:AX中的結果;我想存儲在Z中,它將被printf讀取並輸出乘法值。我明白我出錯的地方,我的語法不正確。感謝您的幫助,我所指的教科書沒有提到word ptr的使用,並且被卡住了,我知道我需要它。再次感謝您的幫助。 – user5894146
'MOV字ptr [Z],AX'移動AX中的16位值並將其存儲到存儲器地址爲Z的16位字中。由於x86是Little Endian,因此必須存儲較低的16位(AX )在_Z_的前2個字節中。 'MOV word ptr [Z + 2],DX'然後將高16位(從_DX_)存儲到存儲器地址爲Z + 2(32位整數值的高位)的16位字中。 –