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

一、实验目的

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题,若要求输入的是两位数,又该怎么办?(选作)
  4. 对于第2题,怎样修改程序可以同时实现将10个数字的累加功能。(选作)

五、代码展示

 程序一


data segment 
		number db 1,2,3,4,5,6,7,8,9,10
		count db 0
		str1 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 si,0
		mov cx,10
		mov ax,0
next:
		add al,number[si]
		inc si
		loop next
		mov count,al
		call printit
		ret
main endp

printit proc near
		lea dx,str1	;输出提示
		mov ah,09
		int 21h
		mov cl,10
		mov ah,0
		div cl		;商在al,余数在ah
		mov bl,ah
		add al,30h
		mov dl,al
		mov ah,02h
		int 21h
		add bl,30h
		mov dl,bl
		mov ah,02h
		int 21h
		ret
printit 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		;10次输入
		mov bx,0
		mov si,0
		call input		;调用输入子程序
		call getmaxmin	;调用求maxmin子程序
		call printit	;调用打印子程序
		ret
main endp

input proc near	
		lea dx,str1		;输入提示
		mov ah,09
		int 21h
		mov ah,01h		;输入
		int 21h
		sub al,30h
		mov buf[si],al
		inc si			
		loop input
		ret
input endp	
	
getmaxmin proc near
		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 s1
less:	cmp bl,dl
		jl s1			;大于当前最小值跳转
		mov bl,dl		;改变最小值
  s1:	loop next		
		mov max,al		;存储到max单元
		mov min,bl		;存储到min单元
		ret
getmaxmin endp		
		
printit proc near
		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
printit 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 si,0
		call input
		call getmaxmin
		call printit
		ret
main endp

input proc near	
input1:	
		lea dx,str1		;输入提示
		mov ah,09
		int 21h
		mov ah,01h		;输入
		int 21h
		sub al,30h
		mov buf[si],al
		add sum,al
		inc si			
		loop input1
		ret
input endp	
	
getmaxmin proc near
		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 s1
less:	cmp bl,dl
		jl s1			;大于当前最小值跳转
		mov bl,dl		;改变最小值
  s1:	loop next		
		mov max,al		;存储到max单元
		mov min,bl		;存储到min单元
		ret
getmaxmin endp		
		
printit proc near
		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,sum
		cmp sum,10		;判断sum的位数
		jge s2
		add al,30h
		mov dl,al
		mov ah,2
		int 21h
		ret		
	s2:
		mov ah,0
		mov cl,10
		div cl			;商在al,余数在ah
		mov bl,ah
		add al,30h
		mov dl,al
		mov ah,2
		int 21h
		add bl,30h
		mov dl,bl
		mov ah,02h
		int 21h
		ret
printit 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 si,0
		call input
		call getmaxmin
		call printit
		ret
main endp

input proc near	
input1:	
		lea dx,str1		;输入提示
		mov ah,09
		int 21h
		mov ah,01h		;输入
		int 21h
		sub al,30h
		mov bl,10
		mul bl
		mov buf[si],al
		mov ah,01h		
		int 21h
		sub al,30h
		add buf[si],al
		mov al,buf[si]
		add sum,al
		inc si			
		loop input1
		ret
input endp	
	
getmaxmin proc near
		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 s1
less:	cmp bl,dl
		jl s1			;大于当前最小值跳转
		mov bl,dl		;改变最小值
  s1:	loop next		;循环比较
		mov max,al		;存储到max单元
		mov min,bl		;存储到min单元
		ret
getmaxmin endp		
		
printit proc near
	printmax:
		lea dx,str2
		mov ah,09
		int 21h
		mov al,max
		mov ah,0
		mov cl,10
		div cl			;商在al,余数在ah
		mov bl,ah
		add al,30h
		mov dl,al
		mov ah,2
		int 21h
		add bl,30h
		mov dl,bl
		mov ah,02h
		int 21h

	printmin:
		lea dx,str3
		mov ah,09
		int 21h
		mov al,min
		mov ah,0
		mov cl,10
		div cl			;商在al,余数在ah
		mov bl,ah
		add al,30h
		mov dl,al
		mov ah,2
		int 21h
		add bl,30h
		mov dl,bl
		mov ah,02h
		int 21h
		
	printsum:
		lea dx,str4		
		mov ah,09
		int 21h
		mov al,sum
		mov ah,0
		mov cl,10
		div cl			;商在al,余数在ah
		mov bl,ah
		add al,30h
		mov dl,al
		mov ah,2
		int 21h
		add bl,30h
		mov dl,bl
		mov ah,02h
		int 21h
		ret
printit endp

code ends
end start


六、结果展示 

程序一

程序二 

程序三

程序四

参考文献:https://blog.csdn.net/qq_44890213/article/details/105825932 

 

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值