2016-09-21 83 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!我不敢相信我遭受了这样的复制/粘贴错误!谢谢。 –