汇编语言上机实验(一)程序

这是我编写的上次的上机实验的程序

首先给一个简单的流程图:

汇编语言上机实验(一)程序

下面是代码:

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

这个只是我们的第一道练手题,后面还有更多的题目,以后再给。