负数和结果的汇编乘法

Multiplication in assembly with negative number and result

我是 Assembly 的新手, 我很难处理负数

#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)
    }
}

p.s。这是我的作业 提前致谢


新问题:

尝试一些组装操作后:

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 结果添加到当前 Array[idx] 值?

用这个where mat3[current index] = 0,操作正确。 但是当例如 mat3[current index] = -2 时,我得到的数字与我期望的数字不同。

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

在此先感谢您的帮助

在 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

但是...如果它乘以两个变量,第二个变量在哪里?答案是第二个变量是 always AL 对于 8 位乘法,always AX 对于 16-位相乘。

  • 8 位乘法的结果最多可达 16 位,因此 总是 存储在 AX.
  • 16位乘法的结果最多可达32位!呃哦! 8086 没有 32 位寄存器!它在哪里存储结果?在 DX:AX。即高16位存放在DX,低16位存放在AX.

对于您的代码,与其将 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 位)。而要存储 high 16 位 DX,你需要将它们 after AX 放在内存中,因此 +2。 (前一行的+0只是为了对称)。

不要忘记:8086 以最低有效字节 存储其多字节值。这意味着您需要存储我上面显示的结果的两部分。