这里是另一种方法。供参考:
CODE SEGMENT
ASSUME CS:CODE
ORG 100H
START: JMP BEGIN
X DQ 111111
DQ 0 ; 增加 这个是为了左移时有空间
Y DQ 11111
Z DW 8 DUP(0)
BEGIN: PUSH CS
POP DS
PUSH CS
POP ES
MOV CX,64
@0:
SHR WORD PTR Y+6,1
RCR WORD PTR Y+4,1
RCR WORD PTR Y+2,1
RCR WORD PTR Y,1
JNC @1
MOV AX,WORD PTR X
ADD WORD PTR Z,AX
MOV AX,WORD PTR X+2
ADC WORD PTR Z+2,AX
MOV AX,WORD PTR X+4
ADC WORD PTR Z+4,AX
MOV AX,WORD PTR X+6
ADC WORD PTR Z+6,AX
MOV AX,WORD PTR X+8
ADC WORD PTR Z+8,AX
MOV AX,WORD PTR X+10
ADC WORD PTR Z+10,AX
MOV AX,WORD PTR X+12
ADC WORD PTR Z+12,AX
MOV AX,WORD PTR X+14
ADC WORD PTR Z+14,AX
@1:
SHL WORD PTR X,1
RCL WORD PTR X+2,1
RCL WORD PTR X+4,1
RCL WORD PTR X+6,1
RCL WORD PTR X+8,1
RCL WORD PTR X+10,1
RCL WORD PTR X+12,1
RCL WORD PTR X+14,1
DEC CX
CMP CX,0
JE @2
JMP @0
@2:
MOV AX,Z
MOV DX,Z+2
CALL DISPDXAX
MOV AH,4CH
INT 21H
有偿就不必了,必须给采纳啊。
;低位在前,高位在后。
dseg segment
X db 0FFh, 002h, 0Feh, 0DEH, 04h, 03h, 29h, 77h
Y db 010h, 001h, 05dh, 078h, 088h, 022h, 94h, 28h
Z db 20 dup (0)
dseg ends
assume cs:cseg, ds:dseg
cseg segment
start:
mov ax, dseg
mov ds, ax
mov si, 0
mov ch,8
$0:
mov cl, 8
mov bx, 0
$1:
mov al, X[si]
mul Y[bx]
add Z[si+bx], al
adc Z[si+bx+1], ah
inc bx
dec cl
jnz $1
inc si
dec ch
jnz $0
mov ax, 4c00h
int 21h
cseg ends
end start
选定 Intel CPU 32位指令编写:
ASSUME CS:CODE, DS:DATA
DATA SEGMENT
X1 DQ 123456 ;32位数
X2 DQ 654321 ;32位数
Y1 DQ 13579
Y2 DQ 987654
Z1 DQ 0 ;积为128位数
Z2 DQ 0
Z3 DQ 0
Z4 DQ 0
DATA ENDS
CODE SEGMENT
START:
MOV AX, DATA
MOV DS, AX
.386
MOV EAX, DWORD PTR X1
MUL DWORD PTR Y1
MOV DWORD PTR Z1, EAX
MOV DWORD PTR Z2, EDX
MOV EAX, DWORD PTR X2
MUL DWORD PTR Y1
ADD DWORD PTR Z2, EAX
ADC DWORD PTR Z3, EDX
MOV EAX, DWORD PTR X1
MUL DWORD PTR Y2
ADD DWORD PTR Z2, EAX
ADC DWORD PTR Z3, EDX
ADC DWORD PTR Z4, 0
MOV EAX, DWORD PTR X2
MUL DWORD PTR Y2
ADD DWORD PTR Z3, EAX
ADC DWORD PTR Z4, EDX
.8086
EXIT:
MOV AH, 4CH
INT 21H
CODE ENDS
END START
本程序实现:X2X1 * Y2Y1 ---> Z4Z3Z2Z1。