📄 huibian.asm
字号:
DSPMESS PROC
PUSH AX
MOV AH,9
INT 21H
POP AX
RET
DSPMESS ENDP
CRLF PROC
PUSH AX
PUSH DX
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
POP DX
POP AX
RET
CRLF ENDP
;-------------------------------------------------------------------------------
;检查无符号数输入是否合格 in:si out:BP
CHECK PROC
PUSH CX
PUSH AX
PUSH SI
MOV BP,1 ;预先置BP为1
INC SI
MOV CL,[SI]
XOR CH,CH
CHECK1:INC SI
MOV AL,[SI]
CMP AL,'0' ;判断输入是否是0--9的数字
JB CHECK2
CMP AL,'9'
JA CHECK2
LOOP CHECK1
JMP CHECK3
CHECK2:MOV BP,0 ;若有其他字符,则置BP为0
CHECK3:POP SI
POP AX
POP CX
RET
CHECK ENDP
;-------------------------------------------------------------------------------
;子程序名CHECK
;功能:检查输入是否合格
;入口参数:si存放输入区首地址
;出口参数:BP存放1或0分别表示正确和错误
CHECK PROC
PUSH CX
PUSH AX
PUSH SI
MOV BP,1 ;预先置BP为1
INC SI
MOV CL,[SI]
XOR CH,CH
DEC CX
INC SI
MOV AL,[SI]
CMP AL,'-' ;判断第一个字符是否为'-'
JE CHECK1
CMP AL,'+' ;判断第一个字符是否为'+'
JE CHECK1
DEC SI
INC CX
CHECK1:INC SI
MOV AL,[SI]
CMP AL,'0' ;判断输入是否是0--9的数字
JB CHECK2
CMP AL,'9'
JA CHECK2
LOOP CHECK1
JMP CHECK3
CHECK2:MOV BP,0 ;若有其他字符,则置BP为0
CHECK3: POP SI
POP AX
POP CX
RET
CHECK ENDP
;-------------------------------------------------------------------------------
;功能:把BX中无符号的二进制数转换为无符号十进制数ASCII码,并输出到屏幕上
;入口:BX
;OUT:屏幕
BINTOD PROC
PUSH AX
PUSH CX
PUSH SI
PUSH DX
XOR AX,AX
XOR DX,DX
MOV AX,BX
BINTOD1:MOV SI,10
MOV CX,0
BINTOD2:DIV SI
ADD DL,'0'
PUSH DX
MOV DX,0
INC CX
CMP AX,0
JNZ BINTOD2
BINTOD3:POP DX
MOV AH,2
INT 21H
LOOP BINTOD3
POP DX
POP SI
POP CX
POP AX
RET
BINTOD ENDP
;-------------------------------------------------------------------------------
;功能:把缓冲区中无符号的十进制数转换为无符号二进制数,存到BX中
;IN:SI
;OUT:BX
DTOBIN PROC
PUSH AX
PUSH CX
PUSH DX
PUSH SI
XOR AX,AX
INC SI
MOV CL,[SI]
INC SI
XOR CH,CH
JCXZ DTOBIN2
DTOBIN1:MOV DX,10
MUL DX
MOV DL,[SI]
INC SI
AND DL,0FH
XOR DH,DH
ADD AX,DX
LOOP DTOBIN1
DTOBIN2:MOV BX,AX
POP SI
POP DX
POP CX
POP AX
RET
DTOBIN ENDP
;-------------------------------------------------------------------------------
;子程序名DTOBIN
;功能:把缓冲区中有符号的十进制数转换为有符号二进制数,存到BX中
;入口参数:DS:SI存放缓冲区首地址
;出口参数:BX存放转换后的二进制数
DTOBIN PROC
PUSH AX
PUSH DX
PUSH CX
PUSH DI
XOR AX,AX
XOR DX,DX
MOV DI,1 ;预置DI为1,表示非负
MOV CL,BYTE PTR[SI+1]
MOV CH,0
CMP BYTE PTR[SI+2],'-' ;判断第一个字符是否为'-'
JNZ SIGN
MOV DI,-1 ;置DI为-1,表示负数
INC SI
DEC CX
SIGN: CMP BYTE PTR[SI+2],'+' ;判断字符是否为'+'
JNZ NEXT1
INC SI ;若是,SI加1
DEC CX
NEXT1:ADD SI,2
MOV BH,0
PUSH DI
MOV DI,10
BIN: MOV BL,BYTE PTR[SI]
SUB BL,'0'
MUL DI ;乘十
ADD AX,BX
INC SI
LOOP BIN
POP DI
CMP DI,-1 ;判断是否非负
JNZ NEXT2 ;若是,跳到NEXT2
NOT AX ;若是负数,求反
INC AX ;加1
NEXT2:MOV BX,AX
POP DI
POP CX
POP DX
POP AX
RET
DTOBIN ENDP
;-------------------------------------------------------------------------------
;子程序名:BINTOD
;功能:把BX中有符号的二进制数转换为有符号十进制数ASCII码,并输出到屏幕上
;入口参数:BX保存有符号的二进制数
;出口参数:屏幕
BINTOD PROC
PUSH AX
PUSH CX
PUSH SI
PUSH DX
XOR AX,AX ;清零
XOR DX,DX
MOV AX,BX
MOV BX,1 ;预置BX为1,表示非负
CMP AX,0 ;AX跟零作比较
JGE UNSIGN ;非负则跳转
NEG AX ;负数求反
MOV BX,-1 ;置BX为-1
UNSIGN:MOV SI,10
MOV CX,0
NEXT: DIV SI ;除十的余数
ADD DL,'0' ;转为ASCII码
PUSH DX ;把数字逐位压栈
MOV DX,0
INC CX
CMP AX,0
JNZ NEXT
CMP BX,-1 ;判断是否为负数
JNZ PLAY
MOV DL,'-' ;输出负号
MOV DH,0
CALL OUTPUT
PLAY: POP DX ;数字出栈
CALL OUTPUT ;输出到屏幕上
LOOP PLAY
POP DX
POP SI
POP CX
POP AX
RET
BINTOD ENDP
OUTPUT PROC
PUSH AX
MOV AH,2
INT 21H
POP AX
RET
OUTPUT ENDP
;-------------------------------------------------------------------------------
;功能:实现32位除法
;IN:被除数:DX:AX,除数:BX
;OUT:商:DX:AX,余数:BX
DIV32 PROC
PUSH CX
PUSH SI
MOV SI,BX
MOV CX,AX
MOV AX,DX
XOR DX,DX
DIV SI
XCHG CX,AX
DIV SI
MOV BX,DX
MOV DX,CX
POP SI
POP CX
RET
DIV32 ENDP
;-------------------------------------------------------------------------------
;功能:计算某个数的位数
;入口:AX
;出口:CX
WEISHU PROC
PUSH AX
MOV SI,10
XOR CX,CX
WEISHU1:XOR DX,DX ;除以10,直到商为0
DIV SI
INC CX ;每除一次,CX加一
CMP AX,0
JE WEISHU2
JMP WEISHU1
WEISHU2:POP AX
RET
WEISHU ENDP
;-------------------------------------------------------------------------------
;'Continue?(Y.continue/Anykey.no):$'
CONTINUE PROC
CALL CRLF
MOV BP,1
MOV DX,OFFSET MSG5
CALL DSPMESS
MOV DX,OFFSET INBUF ;输出继续提示
MOV AH,1
INT 21H
CALL CRLF
CMP AL,'Y'
JE CONTINUE1 ;继续计算时跳转
CMP AL,'y'
JE CONTINUE1
MOV BP,0
CONTINUE1:RET
CONTINUE ENDP
;-------------------------------------------------------------------------------
;DAYS1 DB 31,28,31,30,31,30,31,31,30,31,30,31
;DAYS2 DB 31,29,31,30,31,30,31,31,30,31,30,31
; INPUT: AX, BX
; OUTPUT: DX
CALDAYS PROC
PUSH AX
PUSH CX
PUSH SI
MOV SI,OFFSET DAYS1
XOR DX,DX
MOV CX,4
DIV CX
CMP DX,0
JNZ CALDAYS2
PUSH AX
MOV CX,25
DIV CX
CMP DX,0
POP AX
JNZ CALDAYS1
MOV CX,100
DIV CX
CMP DX,0
JNZ CALDAYS2
CALDAYS1:MOV SI, OFFSET DAYS2
CALDAYS2:MOV DL, [BX+SI-1]
XOR DH, DH
POP SI
POP CX
POP AX
RET
CALDAYS ENDP
;-------------------------------------------------------------------------------
;IN:AX
;OUT:LEAP
JUDGELEAP PROC
PUSH AX
PUSH CX
PUSH DX
MOV LEAP,1
XOR DX, DX
MOV CX, 4
DIV CX
CMP DX, 0
JNZ JUDGELEAP1
PUSH AX
MOV CX, 25
DIV CX
POP AX
CMP DX, 0
JNE JUDGELEAP2
MOV CX,100
DIV CX
CMP DX,0
JE JUDGELEAP2
JUDGELEAP1:MOV LEAP,0
JUDGELEAP2:POP DX
POP CX
POP AX
RET
JUDGELEAP ENDP
;-------------------------------------------------------------------------------
;IN:AX
;OUT:DX
CALYEDAYS PROC
CALL JUDGELEAP
MOV DX,365
CMP LEAP,0
JE CALYEDAYS1
INC DX
CALYEDAYS1:RET
CALYEDAYS ENDP
;-------------------------------------------------------------------------------
; INPUT: AX, BX
; OUTPUT: DX
CALDAYS PROC
PUSH CX
PUSH SI
MOV SI, OFFSET DAYS1
CALL JUDGELEAP
CMP LEAP,0
JE CALDAYS2
CALDAYS1:MOV SI, OFFSET DAYS2
CALDAYS2:MOV DL, [BX+SI-1]
XOR DH, DH
POP SI
POP CX
RET
CALDAYS ENDP
;-------------------------------------------------------------------------------
;这是沉底法,即每次把最大的数往后放
;IN:SI(字数组) CX
;OUT:SI(字数组)
MAOPAO PROC
PUSH AX
PUSH BX
PUSH CX
PUSH BP
DEC CX
MAOPAO1:PUSH CX
XOR BP,BP
MAOPAO2:MOV AX,[SI+BP]
MOV BX,[SI+BP+2]
CMP AX,BX
;JNS MAOPAO3
JG MAOPAO3
ADD BP,2
LOOP MAOPAO2
JMP MAOPAO4
MAOPAO3:MOV [SI+BP],BX
MOV [SI+BP+2],AX
ADD BP,2
LOOP MAOPAO2
MAOPAO4:POP CX
LOOP MAOPAO1
POP BP
POP CX
POP BX
POP AX
RET
MAOPAO ENDP
;-------------------------------------------------------------------------------
;IN:SI,CX
;OUT:SI
MAOPAO PROC
PUSH AX
PUSH BX
PUSH CX
PUSH BP
DEC CX
MAOPAO1:PUSH CX
XOR BP,BP
MAOPAO2:MOV AX,[SI+BP]
MAOPAO3:MOV BX,[SI+BP+2]
CMP AX,BX
JG MAOPAO4
ADD BP,2
LOOP MAOPAO3
MAOPAO4:MOV [SI+BP],BX
MOV [SI+BP+2],AX
ADD BP,2
LOOP MAOPAO3
MAOPAO5:POP CX
ADD SI,2
LOOP MAOPAO1
POP BP
POP CX
POP BX
POP AX
RET
MAOPAO ENDP
;-------------------------------------------------------------------------------
;子程序DTOBIN
;功能:将输入区的十进制ASCII码转换成二进制数
;入口参数:SI 指向输入区首地址
;出口参数:DX:AX 存放转换成二进制数
DTOBIN PROC
PUSH BX
PUSH CX
PUSH SI
PUSH DI
XOR AX,AX
XOR DX,DX
INC SI
MOV CL,[SI] ;用字符串中字符个数作为循环数
XOR CH,CH
JCXZ DTOBIN2
DTOBIN1:CLC
PUSH DX
PUSH AX
SHL AX,1
RCL DX,1
JC DTOBIN2 ;当输入区的数超出32位二进制数表示的范围时跳出
SHL AX,1 ;用位移和加法代替乘10:先移位两次 相当于乘4
RCL DX,1 ;再加一次原数,相当与乘5
JC DTOBIN2 ;最后再位移一次,相当于乘0
POP DI
ADD AX,DI
POP DI
ADC DX,DI
JC DTOBIN2
SHL AX,1
RCL DX,1
JC DTOBIN2
INC SI
MOV BL,[SI] ;10倍原数后加上下一位
AND BL,0FH
XOR BH,BH
ADD AX,BX
ADC DX,0
LOOP DTOBIN1
JMP DTOBIN2
DTOBIN2:POP DI
POP SI
POP CX
POP BX
RET
DTOBIN ENDP
;-------------------------------------------------------------------------------
;子程序名BINTOD
;功能:将二进制数转换成十进制ASCII码串,存入输出区
;入口参数:DX:AX存放需要转换的二进制数 SI存放输出区的首地址
;出口参数:SI指向输出区
BINTOD PROC
PUSH SI
PUSH BX
XOR BP,BP
BINTOD1:MOV SI,WORD PTR 10
MOV CX,AX ;先进行高位除法
MOV AX,DX
XOR DX,DX
DIV SI
XCHG CX,AX
DIV SI ;再进行地位除法
PUSH DX
MOV BX,DX
MOV DX,CX
INC BP
CMP AX,0
JNE BINTOD1
BINTOD2:MOV CX,BP
BINTOD3:POP DX
ADD DL,'0' ;将十进制数转换成ASCII码
MOV [DI],DL ;将ASCII码保存到输出区
INC DI
LOOP BINTOD3
POP BX
POP SI
RET
BINTOD ENDP
;-------------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -