这个是两个32位无符号数相乘
DATA
SEGMENT
MULNUM
DW
0010, 0A100H, 0000, 0FFFFH, 4 DUP(?)
DATA
ENDS
STACK
SEGMENT
PARA ‘STACK’
DB
100 DUP(?)
TOP
EQU
LENGTH
STACK
STACK
ENDS
CODE
SEGMENT
ASSUME
CS:CODE, DS:DATA, SS:STACK
START
PROC
FAR
;将本程序作为DOS操作系统的子程。
BEGIN:
PUSH
DS
XOR
AX, AX
PUSH
AX
; 标准程序前缀
MOV
AX, DATA
MOV
DS, AX
MOV
ES, AX
MOV
AX, STACK
MOV
SS, AX
MOV
AX, TOP
MOV
SP, AX
; 以上为设置段地址
;和栈指针
LEA
BX, MULNUM
;取数据的首地址
MUL32:
MOV
AX, [BX]
;取D12至AX
MOV
SI, [BX+4]
;取D22至SI
MOV
DI, [BX+6]
;取D21至DI
MUL
SI
;D12×D22
MOV
[BX+8], AX
;存部分积1
MOV
[BX+0AH], DX
MOV
AX, [BX+2]
;取D11至AX
MUL
SI
; D11×D22
ADD
AX, [BX+0AH]
ADC
DX, 0
;部分积相应部分相加
MOV
[BX+0AH], AX
MOV
[BX+0CH], DX
;存中间结果
MOV
AX, [BX]
;取D12至AX
MUL
DI
; D12×D21
ADD
AX, [BX+0AH]
ADC
DX, [BX+0CH]
;部分积相应部分相加
MOV
[BX+0AH], AX
;存中间结果
MOV
[BX+0CH], DX
PUSHF
;保存上次计算的进位位
MOV
AX, [BX+2]
;取D11至AX
MUL
DI
;与D21相乘
POPF
;取上次的进位位
ADC
DX, 0
ADD
AX, [BX+0CH]
ADC
DX, 0
;部分积相加
MOV
[BX+0CH], AX
MOV
[BX+0EH], DX
;存结果
RET
; 返回到DOS
Start
endp
CODE
ENDS
END
BEGIN