一、实验目的
1、掌握程序设计中的3种基本结构(顺序结构、选择程序、循环程序)。
2、熟练使用汇编语言的指令:数据传送类指令、数据运算类指令、逻辑判断类指令与转移指令、循环指令等。
3、初步了解系统功能调用的使用方法,尝试使用01H号功能调用进行字符输入的方法及使用02H号功能调用进行字符输出(显示)的方法。
二、实验环境与设备
计算机一台,并且安装Windows操作系统和macro assembler 5.0以上版本的系统软件。
三、预备知识
1、掌握汇编语言程序的上机步骤
2、掌握DEBUG的使用方法
3、掌握汇编语言的指令:
( 1 )数据传送类指令。
( 2 )数据运算类指令。
( 3 )逻辑判断类指令。
( 4 )与转移指令。
( 5 )循环指令等。
四、程序说明
1.计算1+2+3+…+10,将结果显示在屏幕上。
2.利用01H号功能调用输入10个一位数字,并将其由ASCII码转换为二进制数,依此保存到变量BUF的10个字节中,变量BUF的形式为BUF DB 10 DUP(?)。编程求出这10个数中的最大数和最小数,将最大数存入MAX单元、最小数存入MIN单元,并将其在屏幕上显示出来。
3.对于第2题,怎样修改程序可以同时实现将10个数字的累加功能。(选作)
4.对于第2题,若要求输入的是两位数,又该怎么办?(选作)
五、程序代码
程序一
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE
START:
PUSH DS
XOR AX,AX
PUSH AX
MOV BX,10 ;1-10
MOV CX,10 ;循环次数
NEXT: ADD AX,BX ;累加
DEC BX ;数字递减
LOOP NEXT
PRINT:
MOV BL,10
DIV BL ;除以10
ADD AL,30H ;十六进制表示的ASCII码值
MOV CH,AH
MOV DL,AL ;输出高位数
MOV AH,2
INT 21H
ADD CH,30H
MOV DL,CH ;输出低位数
MOV AH,2
INT 21H
RET
MAIN ENDP
CODE ENDS
END START
程序二
DATA SEGMENT
BUF DB 10 DUP(?)
MAX DB ?
MIN DB ?
Str1 DB 0DH,0AH,'Please input:','$'
Str2 DB 0DH,0AH,'MAX:','$'
Str3 DB 0DH,0AH,'MIN:','$'
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,10 ;十次输入
MOV BX,0
MOV SI,0
INPUT:
LEA DX,Str1 ;输出提示
MOV AH,09
INT 21H
MOV AH,01H ;输入
INT 21H
SUB AL,30H
MOV BUF[SI],AL
INC SI ;位移+1
LOOP INPUT ;循环输入
MOV CX,9 ;比较9次
MOV SI,0 ;位移初始为0
MOV AL,BUF[SI] ;AL存放最大值
MOV BL,AL ;BL存放最小值
NEXT: INC SI
MOV DL,BUF[SI]
CMP DL,AL
JL LESS ;小于当前最大值跳转
MOV AL,DL ;改变最大值
JMP MORE
LESS: CMP BL,DL
JL MORE ;大于当前最小值跳转
MOV BL,DL ;改变最小值
MORE: LOOP NEXT ;循环比较
MOV MAX,AL ;存储到对应单元
MOV MIN,BL
LEA DX,Str2
MOV AH,09
INT 21H
MOV DL,MAX ;输出最大值
ADD DL,30H
MOV AH,02H
INT 21H
LEA DX,Str3
MOV AH,09
INT 21H
MOV DL,MIN ;输出最小值
ADD DL,30H
MOV AH,02H
INT 21H
RET
MAIN ENDP
CODE ENDS
END START
程序三
DATA SEGMENT
BUF DB 10 DUP(?)
MAX DB ?
MIN DB ?
SUM DB 0
Str1 DB 0DH,0AH,'Please input:','$'
Str2 DB 0DH,0AH,'MAX:','$'
Str3 DB 0DH,0AH,'MIN:','$'
Str4 DB 0DH,0AH,'SUM:','$'
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,10 ;十次输入
MOV BL,0
MOV SI,0
INPUT:
LEA DX,Str1 ;输出提示
MOV AH,09
INT 21H
MOV AH,01H ;输入
INT 21H
SUB AL,30H
MOV BUF[SI],AL
INC SI ;位移+1
LOOP INPUT
MOV CX,9
MOV SI,0
MOV AL,BUF[SI] ;AL存放最大值
MOV BL,AL ;BL存放最小值
NEXT: INC SI
MOV DL,BUF[SI]
CMP DL,AL
JL LESS ;小于当前最大值跳转
MOV AL,DL ;改变最大值
JMP MORE
LESS: CMP BL,DL
JL MORE ;大于当前最小值跳转
MOV BL,DL ;改变最小值
MORE: LOOP NEXT
MOV MAX,AL
MOV MIN,BL
MOV SI,0
MOV CX,10
MOV BL,0
AA:
ADD BL,BUF[SI] ;计算累加和
INC SI ;位移+1
LOOP AA
LEA DX,Str2
MOV AH,09
INT 21H
MOV DL,MAX ;输出最大值
ADD DL,30H
MOV AH,02H
INT 21H
LEA DX,Str3
MOV AH,09
INT 21H
MOV DL,MIN ;输出最小值
ADD DL,30H
MOV AH,02H
INT 21H
LEA DX,Str4
MOV AH,09
INT 21H
MOV AL,BL
MOV AH,0 ;AH置0,使用CBW也可
MOV BL,10
DIV BL
ADD AL,30H
MOV CH,AH
MOV DL,AL ;输出和
MOV AH,2
INT 21H
ADD CH,30H
MOV DL,CH
MOV AH,2
INT 21H
RET
MAIN ENDP
CODE ENDS
END START
程序四
DATA SEGMENT
BUF DB 10 DUP(?)
MAX DB ?
MIN DB ?
Str1 DB 0DH,0AH,'Please input:','$'
Str2 DB 0DH,0AH,'MAX:','$'
Str3 DB 0DH,0AH,'MIN:','$'
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,10
MOV BX,0
MOV SI,0
INPUT:
LEA DX,Str1
MOV AH,09
INT 21H
MOV AH,01H ;输入
INT 21H
SUB AL,30H ;ASCII转换十六进制
MOV AH,0
MOV BL,10
MUL BL ;×10
MOV DL,AL
MOV AH,01H
INT 21H
SUB AL,30H
MOV AH,0
ADD AL,DL ;相加
MOV BUF[SI],AL
INC SI
LOOP INPUT ;循环输入
MOV CX,9
MOV SI,0
MOV AL,BUF[SI] ;AL存放最大值
MOV BL,AL ;BL存放最小值
NEXT:
INC SI
MOV DL,BUF[SI]
CMP DL,AL
JL LOOP1 ;小于当前最大值跳转
MOV AL,DL ;改变最大值
LOOP1:
CMP BL,DL
JL LOOP2 ;大于当前最小值跳转
MOV BL,DL ;改变最小值
LOOP2:
LOOP NEXT
MOV MAX,AL
MOV MIN,BL
PRINTMAX:
LEA DX,Str2
MOV AH,09
INT 21H
MOV AX,0
MOV AL,MAX ;输出最大值
MOV BL,10
DIV BL
ADD AL,30H ;转换为ASCII码
MOV DL,AL
MOV CH,AH
MOV AH,02H
INT 21H
ADD CH,30H
MOV DL,CH
MOV AH,02H
INT 21H
PRINTMIN:
LEA DX,Str3
MOV AH,09
INT 21H
MOV AX,0
MOV AL,MIN ;输出最小值
MOV BL,10
DIV BL
ADD AL,30H
MOV DL,AL
MOV CH,AH
MOV AH,02H
INT 21H
ADD CH,30H
MOV DL,CH
MOV AH,02H
INT 21H
RET
MAIN ENDP
CODE ENDS
END START
六 、实验结果