▷十进制的输入(INDECM程序)
输入范围为-32768到32767,存储在AX寄存器中。
-(DEC(i+1)=DEC(i)×10+输入值);检查是否发生溢出
INDECM PROC
PUSH BX
PUSH CX
PUSH DX
PUSH SI
@BEGIN:
XOR BX,BX ;初始化BX 0
XOR CX,CX ;初始化CX 0
MOV AH,1
INT 21H ;键盘输入
CMP AL,'-'
JE @MINUS ;如果输入的是负号就跳转MINUS
CMP AL,'+'
JE @PLUS ;如果输入的是加号就跳转PLUS
JMP @DO_WHILE ;其它情况跳转DO_WHILE
@MINUS:
MOV CX,1 ;如果是负数给CX存1
@PLUS:
INT 21H ;键盘输入
@DO_WHILE:
CMP AL,'0'
JB @ERROR
CMP AL,'9'
JA @ERROR
;不是数字的情况跳转ERROR
AND AX,000FH
;把ASCII码转换成真实的值,如数字3,ASCII的值为33H,执行以后变成03H,即实际值3
MOV SI,AX ;把AX(输入的数字)临时存到SI里面
MOV AX,10 ;被乘数AX里存10
IMUL BX ;进行乘法,乘数为BX
JO @OVERFLOW ;如果溢出就跳转OVERFLOW
MOV BX,SI ;把之前输入的数字从SI里存到BX里
ADD BX,AX ;把刚刚乘积的结果和之前输入的数字相加,相加结果存到BX里
JO @OVERFLOW ;如果溢出就跳转OVERFLOW
MOV AH,1
INT 21H ;键盘输入
CMP AL,0DH
JE @END_WHILE ;如果输入的是回车就跳转END_WHILE
CMP AL,' '
JE @END_WHILE ;如果输入的是空格就跳转END_WHILE
JMP @DO_WHILE ;如果不是就继续循环
@END_WHILE:
MOV AX,BX ;把最后的结果BX里面的内容存到AX里
CMP CX,0
JE @EXIT ;如果CX是0,正数的情况就跳转EXIT
NEG AX ;如果是负数就取相反数,按位取反(取相反数)
@EXIT:
POP SI ;将栈顶部的内容送回SI
POP DX
POP CX
POP BX
RET
@OVERFLOW:
CMP BX,32768
JNE @ERROR ;如果不等于32768就跳转ERROR
CMP CX,1
JNE @ERROR ;如果CX不等于1,表明是正数,就跳转ERROR
JMP @END_WHILE ;跳转END_WHILE
@ERROR:
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H ;输出回车
JMP @BEGIN ;从头开始
INDECM ENDP
理解一下输入的过程,如果我们分别输入数字347,在程序里到底发生了什么呢
整个过程是:
347
30=3*10
34=30+4
340=34*10
347=340+7
我们以这种方式进行存储
▷十进制的输出(OUTDECM程序)
-将AX寄存器的内容输出为十进制数。
-为了输出十进制数把AX一直除以10的余数存储在栈里
5 4 3 2 1保存到堆栈,再以1 2 3 4 5输出
比如说有个数12345 我就把它每次除10,然后余数存到堆栈里。那么堆栈里 最下面是5 最上面就是1 ,取的时候因为只能从最上面开始取,所以就是先取的1,最后取的5.以此来达到输出十进制的作用
OUTDECM PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX
CMP AX,0
JGE @END_IF ;AX如果是正数(大于等于0)就跳转END_IF
PUSH AX ;为了输出负号临时存储到堆栈里
MOV DL,'-' ;待输出的DL存储负号
MOV AH,2
INT 21H ;输出
POP AX ;从堆栈里取出来
NEG AX ;取相反数
@END_IF:
XOR CX,CX ;初始化CX
MOV BX,10 ;除数BX存储10
@FIND_DEC:
XOR DX,DX ;初始化DX
DIV BX ;无符号字除法
PUSH DX ;余数DX 推到堆栈里去
;商存 在AX里,余数存 在DX里
INC CX ;CX加1
CMP AX,0 ;商如果等于0就表明:除完了,可以开始输出了
JNE @FIND_DEC ;如果商AX不等于0就跳转FIND_DEC,继续循环
MOV AH,2 ;显示输出
@OUT_LOOP:
POP DX ;从堆栈里把10进制值取出来
OR DL,30H ;转换成10进制
INT 21H ;输出
LOOP @OUT_LOOP ;循环每次CX减1
POP DX
POP CX
POP BX
POP AX
RET
OUTDECM ENDP
在写程序的时候,我们可以直接调用这两个十进制输入输出的程序。
一般形式是:INCLUDE 文件名
这个文件名是要在程序的运行目录下能找到的文件
例:
INCLUDE INDECM.ASM
INCLUDE OUTDECM.ASM