小数,弄起来,很费时间。
如果精度要求不高,用 PAI 代表 3.14,就省事了。
试试下面的程序:
DATA SEGMENT ;数据段.
MSG1 DB 13, 10, 'Please input BAN JING : $'
MSG2 DB 13, 10, 'The MIANJI = $'
MSG3 DB 13, 10, 'Input ERROR. $'
MSG4 DB 'PAI. $'
X DW ?
DATA ENDS
;----------------------------------------------
CODE SEGMENT ;代码段.
ASSUME CS: CODE, DS: DATA
START:
MOV AX, DATA
MOV DS, AX
;--------------------------------
MOV DX, OFFSET MSG1 ;提示 Input :
MOV AH, 9
INT 21H
;--------------------------------
IN_LOOP:
MOV X, 0 ;数据清零.
MOV CX, 2 ;输入2位
_INX:
MOV AH, 1 ;输入单个字符.
INT 21H
;--------------------------------
CMP AL, 13
JE PING_FANG
CMP AL, '0'
JB _IN_ERR ;小于'0',不是数字.
CMP AL, '9'
JA _IN_ERR
SUB AL, '0' ;还原为数字.
MOV AH, 0
MOV SI, AX ;暂存新数据.
;
MOV AX, x
MOV BX, 10 ;老数据乘以10
MUL BX
ADD AX, SI ;加上新数据.
MOV X, AX ;保存.
LOOP _INX ;继续输入.
;--------------------------------
PING_FANG:
MOV AX, x ;取来刚刚输入的数字
CMP AX, 0
JZ EXIT
MOV BL, AL
MUL BL
;--------------------------------
DISP:
PUSH AX
MOV DX, OFFSET MSG2
MOV AH, 09H ;显示
INT 21H
POP AX
CALL PRINTAX
MOV DX, OFFSET MSG4 ;PAI
MOV AH, 9
INT 21H
JMP EXIT ;转到结束程序.
;--------------------------------
_IN_ERR: ;不是数字.
MOV DX, OFFSET MSG3 ;提示 Input ERROR.
MOV AH, 9
INT 21H
;--------------------------------
EXIT:
MOV AH, 4CH
INT 21H
;================================
PRINTAX PROC ;
MOV BX, 10 ;
OR AX, AX
JZ _0_
LOOP_P:
XOR DX, DX
DIV BX
MOV CX, AX ;
OR CX, DX
JZ _E_ ;
PUSH DX ;
CALL LOOP_P
POP DX ;
ADD DL, '0' ;
JMP _1_
_0_:MOV DL, '0' ;
_1_:MOV AH, 2
INT 21H
_E_:RET
PRINTAX ENDP
;================================
CODE ENDS
END START
执行结果如下:
c:\masm510>MM
Please input BAN JING : 8
The MIANJI = 64PAI.
c:\masm510>MM
Please input BAN JING : 0
c:\masm510>MM
Please input BAN JING : 1
The MIANJI = 1PAI.
c:\masm510>MM
Please input BAN JING : 2
The MIANJI = 4PAI.
c:\masm510>MM
Please input BAN JING : 99
The MIANJI = 9801PAI.