实验三 子程序应用(数制转换)程序设计

  • Post author:
  • Post category:其他




实验三 子程序应用(数制转换)程序设计



一、实验目的

1)掌握程序设计中的子程序结构;

2)熟练使用过程伪指令、子程序调用和返回等汇编语言的指令编写子程序;

3)掌握数制转换方法;

4)掌握利用DOS系统功能调用进行字符输入及字符输出(显示)的方法。



二、实验环境与设备

计算机一台,并且安装Windows操作系统和macro assembler 5.0以上版本的系统软件。



三、预备知识

1、掌握汇编语言程序的上机步骤

2、掌握DEBUG的使用方法,熟悉以下常用命令

3、掌握汇编语言的指令:

( 1 )数据传送类指令。

( 2 )数据运算类指令。

( 3 )逻辑判断类指令。

( 4 )与转移指令。

( 5 )循环指令等。



四、实验内容

1、编写十进制到十六进制转换程序。要求从键盘取得一个十进制数,然后把该数以十六进制形式在屏幕上显示出来

2、已知从BUF开始存放了10个16进制字数据,编程求出这10个数中的最大数,(将最大数存入MAX字节单元),并将其以10进制数的形式在屏幕上显示出来。

(提示:以上两题都要求采用子程序的方法)

3、从键盘上输入一行字符,如果这行字符比前一次输入的一行字符长度长,则保存该行字符,然后继续输入另一行字符;如果它比前一次输入的行短,则不保存这行字符。按下

‘$’

输入结束,最后将最长的一行字符显示出来。(选作)

(提示:定义数据段,包括两个变量STRING和BUFFER,格式如下:

STRING DB 0 ;存放字符的个数

DB 80 DUP (?), 0DH,0AH,‘$’;存放前一次输入的字符串,兼作显示缓冲区

BUFFER DB 80 ;输入字符串的缓冲区,最多输入80个字符

DB ?

DB 80 DUP (20H)

然后利用0AH号DOS系统功能调用收入字符,用09H号系统功能调用输出。)



五、实验要求

1、上机前要作好充分准备,包括程序框图、源程序清单、调试步骤、测试方法、对运行结果的分析等。

2、要熟悉与实验有关的系统软件(如编辑程序、汇编程序、连接程序和调试程序等)的使用方法。在程序的调试过程中,有意识地学习及掌握debug程序的各种操作命令,以便掌握程序的调试方法及技巧。

3、程序调试完后,须由实验辅导教师在机器上检查运行结果,经教师认可后的源程序方可通过打印输出。每个实验完成后,应写出实验报告。实验报告的要求如下:

(1)实验目的:对本次实验的目的加以说明。

(2)实验内容:本次实验你所完成的具体内容加以说明。

(3)设计思想:绘制程序框图,并说明原理及算法、程序及数据结构、主要符号名等。

(4)程序代码:经辅导教师确认后的程序清单。

(5)结果分析:包括调试情况,如上机时遇到的问题及解决办法、观察到的现象及其分析.对程序设计技巧的总结及分析;程序的输出结果及对结果的分析;实验的心得体会等。



六、设计思想

1.先调用子函数decibin由键盘输入一个数字后,先减去30h把ASCII码形式转换为十进制数形式,保存在bx中,再调用子函数binihex,用十六进制形式显示bx中的数。

2.利用子函数max依次比较,将buf中10个字的最大值放到bx中,再一次除以10000,1000,100,10,并分别把余数放到bx,商放到dl,并转换为ASCII码格式,即把十六进制转为10进制,最后调用2号功能输出结果即可。

3.调用0ah功能,将输入字符放到缓冲区,并把之后输入的字符串依次与缓冲区内容相比较,若小于缓冲区内容,则被替换,直到输入$即停止输入字符串为止,输出最终存放在string中的字符串的内容。

七、源代码

1.

data segment         
        Str1 db 0DH,0AH,'Please input a number: ','$'
        Str2 db 0DH,0AH,'Trans:','$'        	 
data ends 
decihex segment
        assume cs:decihex,ds:data
main proc far				
         push ds       
         sub ax,ax
         push ax
         mov ax,data
         mov ds,ax
repeat:  
         lea dx,Str1  
         mov ah,09
         int 21h
         call decibin
         lea dx,Str2  
         mov ah,09
         int 21h
         call binihex
         mov dl,0ah      
         mov ah,2
         int 21h
         jmp  repeat
main endp
 
decibin proc near
        mov  bx,0
newchar:
        mov ah,1
        int 21h
        sub al,30h
        jl  exit          
        cmp al,9d
        jg  exit          
        cbw               
        xchg ax,bx        
        mov cx,10d
        mul cx
        xchg ax,bx        
        add bx,ax         
        jmp newchar       
exit:
        ret
decibin endp
 
binihex proc near
        mov ch,4
rotate: mov cl,4
        rol bx,cl
        mov al,bl
        and al,0fh
        add al,30h
        cmp al,3ah
        jl  printit
        add al,7h
printit:
        mov dl,al
        mov ah,2
        int 21h
        dec ch
        jnz rotate
        ret
binihex endp
 
decihex ends 
     end main
data segment
	buf dw 05h,0fh,15h,1fh,45h,25h,2ah,32h,3ah,3fh
data ends
code segment
	assume cs:code,ds:data
main proc far
start:
	mov ax,data
	mov ds,ax
 
	call max
	call convey
 
	mov ax,4c00h
	int 21h
 
main endp
max proc near
	mov bx,0
	mov cl,10
	mov ax,buf[bx]
repeat:
	add bx,2
	cmp ax,buf[bx]
	jg greater
	mov ax,buf[bx]	
greater:  
	loop repeat
	mov bx,ax
	ret
max endp
convey proc near
	mov cx,10000d
	call divid	
	mov cx,1000d
	call divid
	mov cx,100d
	call divid
	mov cx,10d
	call divid
	mov cx,1d
	call divid
ret
convey endp
divid proc near	
	mov ax,bx
	mov dx,0
	div cx
	mov bx,dx
	mov dl,al
	add dl,30h
	mov ah,2
	int 21h
ret
divid endp
code ends
	end start
data segment
STRING	DB  0	;存放字符的个数
	DB  80 DUP (?), 0DH,0AH,'$' ;存放前一次输入的字符串,兼作显示缓冲区
 
BUFFER	DB  82	;输入字符串的缓冲区,最多输入80个字符
	DB	?
	DB	80 DUP (?)
outstr db 0dh,0ah,'Longest string:','$'
data ends
 
code segment 
	assume cs:code,ds:data,es:data
main proc far
start:
	mov ax,data
	mov ds,ax
	mov es,ax
repeat:	
	mov ah,02h
	mov dl,0dh
	int 21h
	mov ah,02h
	mov dl,0ah
	int 21h
	lea dx,buffer
	mov ah,0ah
	int 21h
	mov al,buffer[2]
	cmp al,'$'
	jnz compare
	jmp output
compare:
	mov al,buffer[1]
	cmp al,string[0]
	jl repeat
	mov string,al
	lea si,buffer[2]
	lea di,string[1]
	mov cl,buffer[1]
	sub ch,ch
	cld
	rep movsb
	jmp repeat
output:
	lea dx,outstr
	mov ah,09h
	int 21h
	lea dx,string[1]
	mov ah,09h
	int 21h
	mov ah,4ch
	int 21h
main endp
code ends
	end start

八、结果分析

1.

在这里插入图片描述

2.

在这里插入图片描述

3.

在这里插入图片描述



九、实验心得

对于数制转换这个实验,核心关键就是先调用子函数decibin由键盘输入一个数字后,先减去30h把ASCII码形式转换为十进制数形式,保存在bx中,再调用子函数binihex,用十六进制形式显示bx中的数。

然后利用子函数max依次比较,将buf中10个字的最大值放到bx中,再一次除以10000,1000,100,10,并分别把余数放到bx,商放到dl,并转换为ASCII码格式,即把十六进制转为10进制,最后调用2号功能输出结果即可。

最后调用0ah功能,将输入字符放到缓冲区,并把之后输入的字符串依次与缓冲区内容相比较,若小于缓冲区内容,则被替换,直到输入$即停止输入字符串为止,输出最终存放在string中的字符串的内容。

经过实际的汇编代码训练以后,我对于计算机底层处理数据的方式和数制转换的基本原理有了更加深入的理解,在不断修改汇编代码的同时,也加强了我对计算机组成基本原理的理解,进一步打通计算机软硬件之间的沟通桥梁,加深巩固对底层计算机知识原理的理解。



版权声明:本文为david2000999原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。