这个是两个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