0
点赞
收藏
分享

微信扫一扫

汇编源码学习12-子函数模块-输入大整数


;子程序1:输入大整数,将其反序并由ASCII码值转换成数值,输入以非数字字符为结束符。
;入口参数:ES,DI,SI
;ES存放主函数的段地址,DI存放待处理大整型字符串的首地址,SI存放主调函数中长度变量的地址。
;出口:修改大整型和长度变量的值
;用到的寄存器:AX,DS,DI,CX,BX,SI,ES
data2	SEGMENT
		temp	DB 128 DUP(0)
		addrBI	DW ?	;存放传递过来的大整型字符串的首地址
		addrLEN	DW ?	;存放传递过来的长度变量的地址
data2	ENDS
code2	SEGMENT
inBI	PROC	FAR		;input bigint
		ASSUME	CS:code2,DS:data2
		;BEGIN寄存器保护
		PUSH	AX
		PUSH	DS
		PUSH	DI
		PUSH	CX
		PUSH	BX
		PUSH	SI
		PUSH	ES
		;END
		MOV		AX,data2
		MOV		DS,AX
		;保存主调函数传递过来的变量的地址
		MOV		[addrBI],DI
		MOV		[addrLEN],SI
		;BEGIN:输入模块
		LEA		DI,temp
		MOV		CL,0	;记录大整数的位数
		MOV		BL,1	;是否是首位,若首位是0,则继续是首位。1表示是首位,0表示不是
again2_1:
		MOV		AH,1
		INT		21H
		CMP		AL,'0'
		JB		over2_1
		CMP		AL,'9'
		JA		over2_1
		CMP		BL,1	;是否位首位
		JNE		NotFirst	;若不为首位,则继续往下
		CMP		AL,'0'
		JE		again2_1	;为首位,且首位为0,则忽略0,继续输入
NotFirst:
		MOV		BL,0	;将标志更改为“不是首位”
		MOV		[DI],AL
		INC		DI
		INC		CL
		JMP		again2_1
over2_1:
		CMP		AL,0DH	;如果是以Enter结束输入,则先输出一个换行符
		JNE		NotCR
		MOV		DL,0AH
		MOV		AH,02H
		INT		21H
		;END:输入模块结束
NotCR:	MOV		AX,DI	;临时保存DI
		MOV		DI,[addrLEN]
		MOV		ES:[DI],CL	;保存大整数长度
		MOV		DI,AX
		DEC		DI
		MOV		SI,[addrBI]
again2_2:
		MOV		AL,[DI]
		SUB		AL,30H
		MOV		ES:[SI],AL
		DEC		DI
		INC		SI
		DEC		CL
		CMP		CL,0
		JNE		again2_2
		;BEGIN:寄存器恢复
		POP		ES
		POP		SI
		POP		BX
		POP		CX
		POP		DI
		POP		DS
		POP		AX
		;END
		RET
inBI	ENDP
code2	ENDS



举报

相关推荐

0 条评论