一、实验目的
1、掌握程序设计中的3种基本结构(顺序结构、选择程序、循环程序)。
2、熟练使用汇编语言的指令:数据传送类指令、数据运算类指令、逻辑判断类指令与转移指令、循环指令等。
3、初步了解系统功能调用的使用方法,尝试使用01H号功能调用进行字符输入的方法及使用02H号功能调用进行字符输出(显示)的方法。
二、实验环境与设备
计算机一台,并且安装Windows操作系统和macro assembler 5.0以上版本的系统软件。
三、预备知识
1、掌握汇编语言程序的上机步骤
2、掌握DEBUG的使用方法
3、掌握汇编语言的指令:
( 1 )数据传送类指令。
( 2 )数据运算类指令。
( 3 )逻辑判断类指令。
( 4 )与转移指令。
( 5 )循环指令等。
四、程序说明
- 计算1+2+3+…+10,将结果显示在屏幕上。
- 利用01H号功能调用输入10个一位数字,并将其由ASCII码转换为二进制数,依此保存到变量BUF的10个字节中,变量BUF的形式为BUF DB 10 DUP(?)。编程求出这10个数中的最大数和最小数,将最大数存入MAX单元、最小数存入MIN单元,并将其在屏幕上显示出来。
- 对于第2题,若要求输入的是两位数,又该怎么办?(选作)
- 对于第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