负数和结果的汇编乘法
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 以最低有效字节先 存储其多字节值。这意味着您需要存储我上面显示的结果的两部分。
我是 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 以最低有效字节先 存储其多字节值。这意味着您需要存储我上面显示的结果的两部分。