这是我编写的上次的上机实验的程序
首先给一个简单的流程图:
下面是代码:
DATA SEGMENT
BUFFER_A DB 14, ?, 14 DUP(?) ;输入缓冲区
BUFFER_B DB 14, ?, 14 DUP(?) ;输入缓冲区
PRINT_A DB 'To Input A: ', '$' ;输出字符串A提示
PRINT_B DB 'To Input B: ', '$' ;输出字符串B提示
PNT_a DB 'A: ', '$' ;输出A
PNT_b DB 'B: ', '$' ;输出B
PNT_1 DB '1', '$' ;输出1
ERROR_info DB 'To many input ', '$' ;输出错误提示信息--输入太多
erro_info DB 'Please input number', '$';输出错误提示信息--输入不是数字
PRINT_exit db 'Press Any Key to Exit...', '$'
CLRF DB 0DH, 0AH, '$'
DATA ENDS
STACKS SEGMENT
; DW 64 DUP('ST')
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATA,SS:STACKS
MAIN PROC FAR
MOV AX, DATA
MOV DS, AX
MOV AH, 9 ;输出提示信息,请输入A的值
LEA DX, PRINT_A
INT 21H
MOV AH, 0AH ;输入A的值
LEA DX, BUFFER_A
INT 21H
MOV AH, 9 ;输出回车换行
LEA DX, CLRF
INT 21H
MOV CL, BUFFER_A + 1 ;取接受到A的字符个数存在CX中
CMP CL, 10 ;检查是否超过设定位数
JGE ovdrflow
XOR CH, CH
XOR DX, DX ;DX清0
LEA SI, BUFFER_A + 2 ;SI指向接受到A的第一个字符
MOV AH, 2
A3: MOV DL, [SI] ;取输入A的字符最后一位
CMP DL, 57 ;检查是否是数字
JG erro
CMP DL, 48
JL erro
INC SI
LOOP A3
XOR AX, AX
MOV AL, DL ;对最后一位除2,看A是否是奇数
MOV BL, 2 ;
DIV BL
XOR BH, BH
CMP AH, BH
JNE AISJ ;A是奇数跳转
;下面输入B
MOV AH, 9 ;输出提示信息 输入B
LEA DX, PRINT_B
INT 21H
MOV AH, 0AH ;输入B的值
LEA DX, BUFFER_B
INT 21H
MOV AH, 9 ;输出回车换行
LEA DX, CLRF
INT 21H
MOV CL, BUFFER_B + 1 ;取接受到B的字符个数存在CL中
CMP CL, 10 ;检查是否超过设定位数
JGE ovdrflow
XOR CH, CH
XOR DX, DX ;DX清0
LEA SI, BUFFER_B + 2 ;SI指向接受到B的第一个字符
MOV AH, 2
Ab: MOV DL, [SI] ;取输入B的字符最后一位
CMP DL, 57 ;检查是否是数字
JG erro
CMP DL, 48
JL erro
INC SI
LOOP Ab
XOR AX, AX
MOV AL, DL ;对最后一位除2
MOV BL, 2 ;
DIV BL
XOR BH, BH
CMP AH, BH
JNE BISJ_aiso
JMP output
;下面输入B
AISJ: MOV AH, 9 ;输出提示信息 输入B
LEA DX, PRINT_B
INT 21H
MOV AH, 0AH ;输入B的值
LEA DX, BUFFER_B
INT 21H
MOV AH, 9 ;输出回车换行
LEA DX, CLRF
INT 21H
MOV CL, BUFFER_B + 1 ;取接受到B的字符个数存在CL中
CMP CL, 10 ;检查是否超过设定位数
JGE ovdrflow
XOR CH, CH
XOR DX, DX ;DX清0
LEA SI, BUFFER_B + 2 ;SI指向接受到B的第一个字符
MOV AH, 2
Ab_j: MOV DL, [SI] ;取输入B的字符最后一位
CMP DL, 57 ;检查是否是数字
JG erro
CMP DL, 48
JL erro
INC SI
LOOP Ab_j
XOR AX, AX
MOV AL, DL ;对最后一位除2
MOV BL, 2 ;
DIV BL
XOR BH, BH
CMP AH, BH ;看余数是否为0
JNE BISJ_aisj
JMP output
BISJ_aiso: LEA SI, BUFFER_A + 1 ;SI指向A的第一个字符
LEA DI, BUFFER_B + 1 ;DI指向B的第一个字符
MOV CL, 10 ;A,B交换
XOR CH, CH
Rev: MOV AL, [SI]
MOV AH, [DI]
MOV [SI], AH
MOV [DI], AL
INC SI
INC DI
LOOP Rev
JMP output
BISJ_aisj: XOR AL, AL ;清空AL
MOV CL, BUFFER_A + 1
XOR CH, CH
LEA SI, BUFFER_A + 2
getLAST_A: MOV DL, [SI] ;取A的最后一个字符
INC SI
LOOP getLAST_A
DEC SI
MOV CL, BUFFER_A + 1
loop_a: INC DL ;对最后一位加1
CMP DL, 58
JL copy_a
MOV AL, 48
MOV [SI], AL ;改为0
DEC SI ;SI向前移
MOV DL, [SI]
LOOP loop_a
copy_a: MOV [SI], DL
CMP CX, 0
JNE out1
XOR BX, BX
MOV BL, 1
;处理B
out1: XOR AL, AL ;清空AL
MOV CL, BUFFER_B + 1
XOR CH, CH
LEA SI, BUFFER_B + 2
getLAST_B: MOV DL, [SI] ;取A的最后一个字符
INC SI
LOOP getLAST_B
DEC SI
MOV CL, BUFFER_B + 1
loop_b: INC DL ;对最后一位加1
CMP DL, 58
JL copy_b
MOV AL, 48
MOV [SI], AL ;改为0
DEC SI ;SI向前移
MOV DL, [SI]
LOOP loop_b
copy_b: MOV [SI], DL
CMP CX, 0
JNE output
MOV BH, 1
output: MOV AH, 9 ;输出A提示信息
LEA DX, PNT_a
INT 21H
CMP BL, 1
JNE zhijie_a
MOV AH, 9
XOR DX, DX
LEA DX, PNT_1
INT 21H
zhijie_a: MOV CL, BUFFER_A + 1 ;取A字符个数存在CX中
XOR CH, CH
XOR DX, DX
LEA SI, BUFFER_A + 2 ;SI指向接受到的第一个字符
MOV AH, 2
Aa_o: MOV DL, [SI] ;
;ADD DL, 1
INT 21H ;输出A的值
INC SI
LOOP Aa_o
MOV AH, 9 ;输出回车换行
LEA DX, CLRF
INT 21H
MOV AH, 9 ;输出提示信息B
LEA DX, PNT_b
INT 21H
CMP BH, 1
JNE zhijie_b
MOV AH, 9
XOR DX, DX
LEA DX, PNT_1
INT 21H
zhijie_b: MOV CL, BUFFER_B + 1 ;取B的字符个数存在CX中
XOR CH, CH
XOR DX, DX
LEA SI, BUFFER_B + 2 ;SI指向接受到的第一个字符
MOV AH, 2
Ab_o: MOV DL, [SI]
INT 21H ;输出B的值
INC SI
LOOP Ab_o
MOV AH, 9 ;输出回车换行
LEA DX, CLRF
INT 21H
JMP procend
erro: MOV AH, 9
LEA DX, erro_info
INT 21H
JMP procend
ovdrflow: MOV AH, 9
LEA DX, ERROR_info
INT 21H
procend: MOV AX, 4C00H
INT 21H
MAIN ENDP
CODES ENDS
END MAIN
这个只是我们的第一道练手题,后面还有更多的题目,以后再给。