用汇编,有意思,32位实验的内容,求自然数N的阶乘(N小于等于100)
以前都是用高级语言做的高精度,第一次在汇编下做算法题,呵呵……
.486
DATA SEGMENT USE16
BUF DB 1,200 DUP(0)
N DB 100
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
CMP N,0
JNA EXIT
MOVZX CX,N
DEC CX
MOV DL,2
MOV DH,10
L1:
PUSH CX
LEA SI,BUF ;从个位开始计算
MOV BX,0 ;BX用于保存进位
MOV CX,200
L2:
MOV AL,[SI] ;取出当前位
MUL DL
ADD AX,BX ;加上低位进位
DIV DH
MOVZX BX,AL ;商向高位进位
MOV [SI],AH ;保存当前位
INC SI ;计算下一位
LOOP L2
INC DL
POP CX
LOOP L1
EXIT:
MOV CX,200
MOV BL,0
LEA SI,BUF
ADD SI,199
L3:
MOV DL,[SI]
OR BL,DL
JZ NEXT
ADD DL,30H
MOV AH,2
INT 21H
NEXT:
DEC SI
LOOP L3
MOV AH,4CH
INT 21H
CODE ENDS
END BEG
以前都是用高级语言做的高精度,第一次在汇编下做算法题,呵呵……
.486
DATA SEGMENT USE16
BUF DB 1,200 DUP(0)
N DB 100
DATA ENDS
CODE SEGMENT USE16
ASSUME CS:CODE,DS:DATA
BEG:
MOV AX,DATA
MOV DS,AX
CMP N,0
JNA EXIT
MOVZX CX,N
DEC CX
MOV DL,2
MOV DH,10
L1:
PUSH CX
LEA SI,BUF ;从个位开始计算
MOV BX,0 ;BX用于保存进位
MOV CX,200
L2:
MOV AL,[SI] ;取出当前位
MUL DL
ADD AX,BX ;加上低位进位
DIV DH
MOVZX BX,AL ;商向高位进位
MOV [SI],AH ;保存当前位
INC SI ;计算下一位
LOOP L2
INC DL
POP CX
LOOP L1
EXIT:
MOV CX,200
MOV BL,0
LEA SI,BUF
ADD SI,199
L3:
MOV DL,[SI]
OR BL,DL
JZ NEXT
ADD DL,30H
MOV AH,2
INT 21H
NEXT:
DEC SI
LOOP L3
MOV AH,4CH
INT 21H
CODE ENDS
END BEG