现在的位置: 首页 > 综合 > 正文

汇编源码学习11-子函数模块-输出大整数

2013年10月09日 ⁄ 综合 ⁄ 共 942字 ⁄ 字号 评论关闭
;子程序2:输出大整数,将大整数反序,并转为ASCII码
;入口参数:ES,DI,SI
;ES:主调函数的数据段段地址;DI:主调函数中大整型变量的首地址;SI:主调函数中大整型长度变量的地址。
;出口:修改大整型变量
;用到的寄存器:AX,DS,CX,DI,SI,DX,ES
data3	SEGMENT
		addrBI2		DW ?	;存放传递过来的大整型的首地址
		addrLEN2	DW ?	;存放传递过来的大整型长度变量的地址
data3	ENDS
code3	SEGMENT
outBI	PROC	FAR		;output bigint
		ASSUME	CS:code3,DS:data3
		;BEGIN寄存器保护
		PUSH	AX
		PUSH	DS
		PUSH	CX
		PUSH	DI
		PUSH	SI
		PUSH	DX
		PUSH	ES
		;END
		MOV		AX,data3
		MOV		DS,AX
		;用内存变量保存主调函数变量的地址
		MOV		[addrBI2],DI
		MOV		[addrLEN2],SI
		MOV		CL,ES:[SI]
		MOV		SI,DI	;DI存放的是传递过来的大整型的偏移地址
		MOV		CH,0
		ADD		SI,CX
		DEC		SI		;SI指向bigInt尾
again3_1:
		CMP		SI,DI
		JB		over3_1	;SI往回移动,DI往前移动,如果DI移动到SI前面,则循环停止
						;如果这里用JNA,则当长度为奇数时,最中间的数没有转为ASCII码
						;若为JAN,输入:1234567890123456789,12345678901,结果就会有问题
		MOV		AH,ES:[SI]
		ADD		AH,30H
		MOV		AL,ES:[DI]
		ADD		AL,30H
		MOV		ES:[SI],AL
		MOV		ES:[DI],AH
		DEC		SI
		INC		DI
		JMP		again3_1
over3_1:
		MOV		DI,[addrBI2]
		MOV		DX,DI
		ADD		DI,CX
		MOV		ES:[DI],'$(编译时去掉此处括号)'
		MOV		AX,ES
		PUSH	DS
		MOV		DS,AX	;INT 21H的9号功能默认DS:DX,所以除了修改DX的值外,还要修改DS的值
		MOV		AH,09H
		INT		21H
		POP		DS		;恢复DS,尽管没有任何意义,但要养成良好的编程习惯
		;BEGIN:寄存器恢复
		POP		ES
		POP		DX
		POP		SI
		POP		DI
		POP		CX
		POP		DS
		POP		AX
		;END
		RET
outBI	ENDP
code3	ENDS

抱歉!评论已关闭.