将两个多位十进制数相加,要求被加数、加数均以ASCⅡ码形式各自顺序存放在以DATA1和DATA2为首的五个内存单元中(低位在前),结果送回DATA1处。
DATA SEGMENT
DATA1 DB 34H,35H,39H,38H,36H,' ' ;被加数
DATA2 DB 37H,34H,33H,36H,32H,' ' ;加数
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
LEA SI,DATA1 ;有效地址送SI,为调用显示子程序做准备
CALL DISPLAY ;调用显示子程序
CALL CRLF ;调用回车换行子程序
LEA SI,DATA2 ;有效地址送SI,为调用显示子程序做准备,同时为加法运算做准备
CALL DISPLAY ;调用显示子程序
CALL CRLF ;调用回车换行子程序
LEA DI,DATA1 ;有效抵制送DI,为加法运算做准备
MOV AX,0
MOV BX,0
MOV CL,05H ;记录循环次数
ADDS: MOV AL,[SI] ;将加数送往AL
SUB AL,30H
ADD AL,BL ;加上进位
MOV BL,[DI] ;将被加数送往BL
SUB BL,30H
ADD AL,BL ;加法运算
ADD AL,30H
CMP AL,3AH
JA SUBA ;结果>=10,跳到SUBA
JB NSUBA
SUBA: SUB AL,0AH ;减去10的值,并置BL为1 MOV BL,01H
JMP CONTINUE
NSUBA: MOV BL,00H ;置BL为0
CONTINUE:MOV [DI],AL ;将相加的结果从AL送往DI的地址,即DATA1的地址
INC DI ;地址加1
INC SI ;地址加1
LOOP ADDS ;循环
JC SHUCHU
JNC SHUCHU2
SHUCHU2: MOV AL,31H ;CF为1设置结果最高位为1 JMP CONTINUE2
SHUCHU:MOV AL,30H ;CF为0设置结果最高位为0
CONTINUE2:MOV [DI],AL
LEA SI,DATA1 ;将DATA1的有效地址送往SI,为调用DISPLAY子程序做准备 CALL DISPLAY ;调用DISPLAY子程序 MOV AX,4C00H ;返回DOS INT 21H
MAIN ENDP
CRLF PROC NEAR ;回车、换行 于功能 MOV DL,0DH
MOV AH,02H INT 21H MOV DL,0AH
MOV AH,02H INT 21H
RET
CRLF ENDP
DISPLAY PROC NEAR ;显示于功能
MOV BX,0006H ;记录循环次数
DSL: MOV DL,[SI+BX-1] ;将有效地址内的内容送往DL
MOV AH,02 ;2号功能输出
INT 21H
DEC BX ;BX自动减1
JNZ DSL
RET
DISPLAY ENDP
CODE ENDS
END START
2 分支程序设计实验
接收键盘输入字符,将其中的小写字母转换为大写字母并显示。
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE
START: MOV AH,00H
INT 16H
CMP AL,0DH
JZ OVER
CALL JUDGE
MOV DL,AL
MOV AH,02H
INT 21H
JMP START
OVER: MOV AH,4CH
INT 21H
MAIN ENDP
JUDGE PROC NEAR
CMP AL,'a'
JB STOP
CMP AL,'z'
JA STOP
SUB AL,20H
STOP: RET
JUDGE ENDP
CODE ENDS
END START
3 循环程序设计实验
统计一个有10人的班中,男、女生的人数各为多少。将男生人数存入变量MAN、女生人数存入变量WOMAN中。
DATA SEGMENT
MAN DB 0,0
WOMAN DB 0,0
STRING DB ' iuput people number! (man is 0, woman is 1 ) $'
SM DB 'man is :$'
SW DB 'woman is :$'
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV AH,09H ;将STRING的内容输出
MOV DX,OFFSET STRING
INT 21H
CALL CRLF
MOV CX,10 ;男女生总人数
AA: MOV AH,01H ;从键盘输入,0为男,1为女
INT 21H
CMP AL,30H ;与'0'比较
JNZ ADDW ;不为'0',女生人数加1
INC MAN ;否则男生人数加1
BB: LOOP AA
JMP DISPLY ;打印
ADDW: INC WOMAN
JMP BB
DISPLY: CALL CRLF
MOV AH,09H ;字符串输出
MOV DX,OFFSET SM
INT 21H
MOV AH,02H ;男生人数统计结果输出
MOV DL,MAN
ADD DL,30H
CALL JUDGE
CALL CRLF
MOV AH,09H ;字符串输出
MOV DX,OFFSET SW
INT 21H
MOV AH,02H ;女生人数统计结果输出
MOV DL,WOMAN
ADD DL,30H
CALL JUDGE
MOV AH,4CH ;返回DOS
INT 21H
MAIN ENDP
JUDGE PROC NEAR ;判断结果是否为39H
CMP DL,3AH
JZ SHI
CC: INT 21H
RET
SHI: MOV DL,31H
INT 21H
MOV DL,30H
JMP CC
JUDGE ENDP
CRLF PROC NEAR ;回车换行子程序
MOV AH,02H ;回车
MOV DL,0DH
INT 21H
MOV DL,0AH ;换行
INT 21H
RET
CRLF ENDP
CODE ENDS
END START
4 子程序设计实验
1.键盘输入字符,依次显示在行的最左端(即每接受一个字符,显示在屏幕上并回车换行。)
2.对频繁使用的回车换行编写为子程序,在主程序中调用完成分行显示。
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE
START: MOV CX,10 ;设置循环次数
NEXT: MOV AH,01H ;从键盘输入一个字符
INT 21H
CALL CRLF ;调用回车换行子程序
LOOP NEXT
MOV AH,4CH ;返回DOS
INT 21H
MAIN ENDP
CRLF PROC NEAR ;回车换行子程序
MOV AH,02H ;回车
MOV DL,0DH
INT 21H
MOV DL,0AH ;换行
INT 21H
RET
CRLF ENDP
CODE ENDS
END START
5 码制转换程序实验
将ASCⅡ码数据转换成二进制数据。要求从键盘上输入十进制整数(假定范围0~32767),然后转换成二进制格式存储。
DATA SEGMENT
STRING1 DB 'PLEASE INPUT A NUMBER(0~32767):$'
STRING2 DB 'THE ASCII IS:$'
STRING3 DB 'THE BINARY IS:$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STRING1
MOV AH,09H
INT 21H
CALL CRLF
INPUT: MOV AH,01H ;输入数据
INT 21H
CMP AL,0DH
JZ NEXT
SUB AL,30H
JL INPUT
CMP AL,39H
JG INPUT
CBW
XCHG AX,BX ;AX为输入值,BX保存结果,两个对调为MUL做准备
MOV DX,10D ;将上一次结果乘10
MUL DX
XCHG AX,BX ;AX为本次输入的值,BX为之前的结果
ADD BX,AX
JMP INPUT
NEXT: CALL CRLF
MOV CL,4D
MOV CH,4D
MOV DX,OFFSET STRING2
MOV AH,09H
INT 21H
CALL CRLF
LOOP0: ROL BX,CL ;循环左移,将最高为存到BL的低四位
MOV AL,BL
AND AL,0FH ;
ADD AL,30H
CMP AL,3AH
JL OUTPUT
ADD AL,07H
OUTPUT:MOV AH,02H
MOV DL,AL
INT 21H
DEC CH
JNZ LOOP0
CALL CRLF
MOV DX,OFFSET STRING3
MOV AH,09H
INT 21H
CALL CRLF
MOV CH,16D
MOV CL,1D
LOOP1: ROL BX,CL
MOV AL,BL
AND AL,01H
ADD AL,30H
MOV AH,02H
MOV DL,AL
INT 21H
DEC CH
JNZ LOOP1
MOV AH,4CH
INT 21H
MAIN ENDP
OUTS PROC NEAR ;字符串输出子程序
MOV AH,09H
INT 21H
RET
OUTS ENDP
CRLF PROC NEAR ;回车换行子程序
MOV AH,02H ;回车
INT 21H
MOV DL,0AH ;换行
INT 21H
RET
CRLF ENDP
CODE ENDS
END START
6 两个数相乘的实验
实现十进制数的乘法,被乘数和乘数均以ASCⅡ码形式放在内存中,乘积在屏幕上显示出来。
DATA SEGMENT
MBCS DW 0
MCS DW 0
RESULT DW 0
STRING1 DB 'THE BEICHENGSHU IS:$'
STRING2 DB 'THE CHENGSHU IS:$'
STRING3 DB 'THE RESULT IS:$'
STRING DB 'THE ASCII IS:$'
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STRING1
CALL OUTS
CALL INPUT ;输入被乘数
MOV DX,OFFSET STRING
CALL OUTS
CALL CRLF
CALL ASCII ;被乘数转化为ASCII码输出
CALL CRLF
MOV MBCS,BX ;被乘数保存到MBCS中
MOV DX,OFFSET STRING2
CALL OUTS
CALL INPUT ;输入乘数
MOV DX,OFFSET STRING
CALL OUTS
CALL CRLF
CALL ASCII ;乘数转化为ASCII码输出
CALL CRLF
MOV MCS,BX ;乘数保存到MCS中
MOV DX,OFFSET STRING3
CALL OUTS
CALL CRLF
MOV AX,MBCS ;被乘数
MUL BX ;乘数与被乘数相乘,结果高位DX,低位AX
MOV RESULT,AX ;将AX中的内容保存到RESULT中
MOV BX,DX ;将高位DX的值送给BX输出
CALL ASCII
MOV BX,RESULT ;将低位AX的值送给BX输出
CALL ASCII
MOV AH,4CH
INT 21H
MAIN ENDP
INPUT PROC NEAR ;输入十进制数,将其转化为ASCII码存到BX中
CALL CRLF
MOV BX,0
AA: MOV AH,01H
INT 21H
CMP AL,0DH
JZ STOP
SUB AL,30H
JL AA
CMP AL,39H
JG AA
CBW
XCHG AX,BX ;AX为输入值,BX保存结果,两个对调为MUL做准备
MOV DX,10D ;将上一次结果乘10
MUL DX
XCHG AX,BX ;AX为本次输入的值,BX为之前的结果
ADD BX,AX
JMP AA
STOP: CALL CRLF
RET
INPUT ENDP
ASCII PROC NEAR
MOV CL,4D
MOV CH,4D
CC: ROL BX,CL ;循环左移,将最高为存到BL的低四位
MOV AL,BL
AND AL,0FH ;
ADD AL,30H
CMP AL,3AH
JL BB
ADD AL,07H
BB: MOV AH,02H
MOV DL,AL
INT 21H
DEC CH
JNZ CC
RET
ASCII ENDP
OUTS PROC NEAR
MOV AH,09H
INT 21H
RET
OUTS ENDP
CRLF PROC NEAR ;回车换行子程序
MOV AH,02H ;回车
MOV DL,0DH
INT 21H
MOV DL,0AH ;换行
INT 21H
RET
CRLF ENDP
CODE ENDS
END START
7 从键盘输入数据并显示的程序
编写程序将键盘接收到的四位十六进制数据转换为等值的二进制数,再显示在终端上。
DATA SEGMENT
STRING1 DB 'Please enter a four-digit hexadecimal number:$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STRING1
MOV AH,09H
INT 21H
CALL CRLF
MOV CL,4D
INPUT: MOV AH,01H
INT 21H
CMP AL,'0'
JB INPUT
CMP AL,'9'
JA ZIMU
SUB AL,30H
JMP NEXT
ZIMU: CMP AL,'A'
JB INPUT
CMP AL,'Z'
JA INPUT
SUB AL,37H
NEXT: CBW
XCHG AX,BX
MOV DX,16D
MUL DX
XCHG AX,BX
ADD BX,AX
LOOP INPUT
CALL CRLF
MOV CL,1D
MOV CH,16D
TO: ROL BX,1
MOV DL,BL
AND DL,01H
ADD DL,30H
MOV AH,02H
INT 21H
DEC CH
JNZ TO
MOV AH,4CH
INT 21H
MAIN ENDP
CRLF PROC NEAR ;回车换行子程序
MOV AH,02H ;回车
MOV DL,0DH
INT 21H
MOV DL,0AH ;换行
INT 21H
RET
CRLF ENDP
CODE ENDS
END START
8 字符和数据的显示程序
先显示信息“INPUT STRING THE END FLAG IS $”再接受字符如为0~9则计数器加1并显示数据。如为非数字,则直接显示但不计数。
DATA SEGMENT
STRING1 DB 'INPUT STRING THE END FLAG IS $'
COUNT DB 0
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
MAIN PROC FAR
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET STRING1
MOV AH,09H
INT 21H
CALL CRLF
INPUT: MOV AH,0
INT 16H
CMP AL,0DH
JZ STOP
CMP AL,'0'
JB TO
CMP AL,'9'
JA TO
INC COUNT
TO: MOV AH,02H
MOV DL,AL
INT 21H
JMP INPUT
STOP: CALL CRLF
MOV AH,02H
MOV DL,COUNT
ADD DL,30H
INT 21H
MOV AH,4CH
INT 21H
MAIN ENDP
CRLF PROC NEAR ;回车换行子程序
MOV AH,02H ;回车
MOV DL,0DH
INT 21H
MOV DL,0AH ;换行
INT 21H
RET
CRLF ENDP
CODE ENDS
END START下载本文