汇编实验二 分支与循环程序设计

一、实验目的

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

六 、实验结果

汇编实验二 分支与循环程序设计_第1张图片
汇编实验二 分支与循环程序设计_第2张图片
汇编实验二 分支与循环程序设计_第3张图片
汇编实验二 分支与循环程序设计_第4张图片

你可能感兴趣的:(汇编语言)