;子程序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