▷十进制的输入(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

最后修改:2022 年 03 月 08 日
如果觉得我的文章对你有用,请随意赞赏