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