汇编语言——《分支与循环程序设计》实验报告

实验目的

1、掌握程序设计中的3种基本结构(顺序结构、选择程序、循环程序)。

2、熟练使用汇编语言的指令:数据传送类指令、数据运算类指令、逻辑判断类指令与转移指令、循环指令等。

3、初步了解系统功能调用的使用方法,尝试使用01H号功能调用进行字符输入的方法及使用02H号功能调用进行字符输出(显示)的方法。

实验内容

  1. 计算1+2+3+…+10,将结果显示在屏幕上。
  2. 利用01H号功能调用输入10个一位数字,并将其由ASCII码转换为二进制数,依此保存到变量BUF的10个字节中,变量BUF的形式为BUF  DB  10  DUP(?)。编程求出这10个数中的最大数和最小数,将最大数存入MAX单元、最小数存入MIN单元,并将其在屏幕上显示出来。
  3. 对于第2题,怎样修改程序可以同时实现将10个数字的累加功能。(选作)
  4. 对于第2题,若要求输入的是两位数,又该怎么办?(选作)

设计思想

1、先将1-10循环求和,为了将结果显示在屏幕上,需要讲计算后保存在ax中的结果以十进制形式输出,可以将结果的两位数分别存于低位和高位中,即除以10取整和余   AL是商,AH是余数,后加上30h。

2、使用SI寄存器,用于在存储器中寻址。利用循环输入10个数字,将10个数比较,大的放在AL,小的放在BL。利用01H号功能,输出。

3、结合第1题和第2题。

4、修改输入。

程序代码

1

code segment
	main proc far
	assume cs:code
start:
	push ds
	sub ax,ax
	push ax
	mov bx,0ah
	mov cx, 0ah
sum1:
	add ax,bx
	dec bx
	loop sum1
printit:
	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

2

data segment         ;数据段定义开始
    buf db 10 dup(?)      ;数据定义及其存储空间
    max db ?
    min db ?
    Str1 db 0DH,0AH,'Please input: ','$'  	 ;定义Str1的内容
    Str2 db 0DH,0AH,'MAX:','$'      	 ;定义Str2的内容
    Str3 db 0DH,0AH,'MIN:','$'        	 ;定义Str3的内容
data ends    ;数据段定义结束  

Stack segment stack   ;堆栈段定义开始
    db 10 dup(?)
stack ends      ;堆栈段定义结束

code segment    ;代码段定义开始
main proc far     
    assume cs:code,ds:data,ss:stack
start:    					
    push ds       
    sub ax,ax
    push ax
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov cx,10
    mov si,0      ;寄存器,用于寻址
    mov bx,0
lop1:				
    lea dx,Str1  
    mov ah,09
    int 21h
    mov ah,01h    ; 输入
    int 21h
    mov buf[si],al
    inc si
    loop lop1    ;返回循环1
    mov cx,9
    mov si,0
    mov al,buf[si]
    mov bl,al
lop2:
    inc si   
    mov dl,buf[si]
    cmp dl,al
    jl compare1
    mov al,dl
compare1:
    cmp bl,dl 		 ;比较,小的数放在bl
    jl compare2
    mov bl,dl
compare2:
    loop lop2   
    mov max,al   
    mov min,bl 
    lea dx,Str2
    mov ah,09
    int 21h
    mov dl,max
    mov ah,02h                  
    int 21h       	;输出最大数
    lea dx,Str3
    mov ah,09
    int 21h
    mov dl,min
    mov ah,02h                  
    int 21h       	;输出最小数
    ret 
    main endp
    code ends    
end start

3

data segment         ;数据段定义开始
    buf db 10 dup(?)      ;数据定义及其存储空间
    max db ?
    min db ?
    Str1 db 0DH,0AH,'Please input: ','$'  	 ;定义Str1的内容
    Str2 db 0DH,0AH,'MAX:','$'      	 ;定义Str2的内容
    Str3 db 0DH,0AH,'MIN:','$'        	 ;定义Str3的内容
    Str4 db 0DH,0AH,'SUM:','$'        	 ;定义Str4的内容
data ends    ;数据段定义结束  

Stack segment stack   ;堆栈段定义开始
    db 10 dup(?)
stack ends      ;堆栈段定义结束

code segment    ;代码段定义开始
main proc far     
    assume cs:code,ds:data,ss:stack
start:    					
    push ds       
    sub ax,ax
    push ax
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov cx,10
    mov si,0      ;寄存器,用于寻址
    mov bx,0
lop1:				
    lea dx,Str1  
    mov ah,09
    int 21h
    mov ah,01h    ; 输入
    int 21h
    mov buf[si],al
    inc si
    loop lop1    ;返回循环1
    mov cx,9
    mov si,0
    mov al,buf[si]
    mov bl,al
lop2:
    inc si   
    mov dl,buf[si]
    cmp dl,al
    jl compare1
    mov al,dl
compare1:
    cmp bl,dl 		 ;比较,小的数放在bl
    jl compare2
    mov bl,dl
compare2:
    loop lop2   
    mov max,al   
    mov min,bl 
    lea dx,Str2
    mov ah,09
    int 21h
    mov dl,max
    mov ah,02h                  
    int 21h       	;输出最大数
    lea dx,Str3
    mov ah,09
    int 21h
    mov dl,min
    mov ah,02h                  
    int 21h       	;输出最小数
    lea dx,Str4
    mov ah,09
    int 21h
    sub ax,ax
    mov bx,0
    mov cx,9
    mov si,0
sum1:
    inc si   
    mov bl,buf[si]
    sub bl,30h
    add ax,bl
    loop sum1
printit:
    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

4

data segment         ;数据段定义开始
    buf db 10 dup(?)      ;数据定义及其存储空间
    max db ?
    min db ?
    Str1 db 0DH,0AH,'Please input: ','$'  	 ;定义Str1的内容
    Str2 db 0DH,0AH,'MAX:','$'      	 ;定义Str2的内容
    Str3 db 0DH,0AH,'MIN:','$'        	 ;定义Str3的内容
data ends    ;数据段定义结束  

Stack segment stack   ;堆栈段定义开始
    db 10 dup(?)
stack ends      ;堆栈段定义结束

code segment    ;代码段定义开始
main proc far     
    assume cs:code,ds:data,ss:stack
start:    					
    push ds       
    sub ax,ax
    push ax
    mov ax,data
    mov ds,ax
    mov ax,stack
    mov ss,ax
    mov cx,10
    mov si,0      ;寄存器,用于寻址
    mov bx,0
lop1:				
    lea dx,Str1  
    mov ah,09h
    int 21h
    mov ah,01h ; 输入1
    int 21h
    sub al,30h
    mov ah,0
    mov bl,10
    mul bl
    mov dl,al
    mov ah,01h ; 输入2
    int 21h
    sub al,30h
    mov ah,0
    add al,dl
    mov buf[si],al
    inc si
    loop lop1    ;返回循环1
    mov cx,9
    mov si,0
    mov al,buf[si]
    mov bl,al
lop2:
    inc si   
    mov dl,buf[si]
    cmp dl,al
    jl compare1
    mov al,dl
compare1:
    cmp bl,dl 		 ;比较,小的数放在bl
    jl compare2
    mov bl,dl
compare2:
    loop lop2   
    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
    mov ch,ah
    mov dl,al
    mov ah,2
    int 21h
    add ch,30h
    mov dl,ch
    mov ah,2
    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 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

结果分析

1

2

3

4

参考文章

https://blog.csdn.net/csj41352/article/details/79981434

https://zhidao.baidu.com/question/562479802788685844.html

https://wenku.baidu.com/view/af740cdc19e8b8f67d1cb92f.html

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页