2016-09-21 54 views
0

我在大會 相當新的,我有一個hardtime處理負數乘法與負數組裝,並導致

#include <stdio.h> 
void main() { 
    short int mat1[] = {-1,-2, 4,5, 4,-2}; // first array 
    short int mat2[] = {2,0,0,0, 0,2,0,0}; // second array 
    int mat3[1024]; // result array 

    __asm { 
     MOV AX, mat1[0] ; mat1[0]:= -1 
     MOV BX, mat2[0] ; mat2[0]:= 2 
     ; my problem is how i can do this 
     ; mat3[0] = mat1[0] * mat2[0] ; 
     ; (operation result -> mat3[0] = -2) 
    } 
} 

附:這是我的功課提前


新問題 感謝:

嘗試一些裝配操作後:

MOV AX, mat1[ECX] ; eax is 0 and mat1[ecx] is -1 

但這種操作之後 怎麼來ax設置爲65535,而不是到-1? 如何正確乘法然後如果AX寄存器不正確? 我很迷惑如何處理2


補充我有另外一個問題。 目前我有這個代碼,我移動IMUL結果到數組。

MOV WORD PTR mat3[ECX*4]+0, AX 
    MOV WORD PTR mat3[ECX*4]+2, DX 

我的問題是我怎麼可以添加IMUL結果到當前的陣列[IDX]價值?

這裏mat3 [current index] = 0,操作是正確的。 但是當例如mat3 [當前索引] = -2時,我的數字與我期望得到的數目不同。

ADD WORD PTR mat3[ECX*4]+0, AX 
    ADD WORD PTR mat3[ECX*4]+2, DX 

我感謝你在你的幫助

+0

無需回答。我遺憾地想通了。 – whebz

+0

另請參見[我的答案在這裏有關乘以16位數字並生成32位('int')結果](http://stackoverflow.com/questions/39581293/invalid-instruction-operands-on-mov-ah -word變量和 - 使用-IMUL-ON-16-BI/39582213#39582213)。 –

回答

3

隨着8086架構中,有兩個指令對兩個數相乘,但也可以使用不同的參數:

Val8 DB 12  ; 8-bit variable 
Val16 DW 12345 ; 16-bt variable 

MUL BL   ; Unsigned multiply of 8-bit register 
MUL [Val8]  ; Unsigned multiply of 8-bit memory location 
MUL BX   ; Unsigned multiply of 16-bit register 
MUL [Val16] ; Unsigned multiply of 16-bit memory location 

IMUL BL   ; Signed multiply of 8-bit register 
IMUL [Val8]  ; Signed multiply of 8-bit memory location 
IMUL BX   ; Signed multiply of 16-bit register 
IMUL [Val16] ; Signed multiply of 16-bit memory location 

但是...如果它乘以兩個變量,第二個變量在哪裏?答案是對於8位乘法,第二個變量是總是AL,而對於16位乘法,總是AX

  • 一個8位乘法的結果可以是高達16位,所以它總是存儲在AX
  • 16位乘法的結果可以達到32位!呃哦! 8086沒有32位寄存器!它在哪裏存儲結果?在DX:AX。也就是說,它在DX中存儲高16位,在AX中存儲低16位。

爲您的代碼,而不是移動mat2[0]BX,你可以簡單地IMUL它直接從內存 - 是的,你應該使用IMUL因爲你想要一個符號乘法。

一旦得到IMUL的結果,您需要將結果存儲在mat3[0]中。既然你不能用一條指令移動DX:AX,你需要兩條。我不知道你在使用哪個彙編程序,但通常語法如下:

MOV WORD PTR mat3[0]+0, AX 
MOV WORD PTR mat3[0]+2, DX 

仔細看看上面的內容! mat3[0]是一個32位int,因此您不能將16位寄存器移入其中。您需要先告訴彙編器將其視爲WORD(16位)。並且要存儲DX中的16位,則需要將它們放在內存中的AX之後,因此+2就是。 (之前的行中的+0僅用於對稱)。

不要忘記:8086存儲其最低有效字節第一個的多字節值。這意味着您需要存儲結果的兩部分,如上所示。

+0

OP顯然使用C++的32位代碼,並不限於在8086上運行.imul的雙操作數形式非常方便。此外,正在使用的彙編程序是MSVC++內置的彙編程序。據我瞭解,它非常像MASM。 –

+1

@PeterCordes當我第一次看到這個問題時,它有:一個8086標籤;只有x86指令;只有原始的C++代碼。這些最新的編輯...改變了事情。超過你! –

+1

@Macmade D'oh!我不敢相信我遭受了這樣的複製/粘貼錯誤!謝謝。 –