微机原理实验报告

更新时间:2024-04-30 20:28:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

《微机实验及课程设计》实验报告

东南大学

《微机实验及课程设计》

实验报告

实验二

汇编语言程序设计

姓 名: 学 号:

专 业: 实 验 室: 计算机硬件技术

实验时间: 2011年04月12日 报告时间: 2010年04月22日 评定成绩: 审阅教师:

0

《微机实验及课程设计》实验报告

一. 实验目的与内容(概述)

(含简单文字叙述)

实验目的:

1) 进一步熟悉汇编语言程序的编辑、宏汇编、链接、运行基本概念;

2)熟练掌握动态调试程序TD/DEBUG 的常用命令或窗口功能,学会用TD/DEBUG 调试程序,修改数据和 寄存器等环境;

3)熟悉掌握汇编语言程序的典型数据结构设计、典型程序流控制方法,了解DOS/BIOS 功能调用的基 本方法。

实验内容:

(1)编写程序实现如下功能:

① 从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母 (其他字符不变)并按原顺序将这些字符在屏幕上显示出来。

② 从键盘输入在0~65535 之间的十进制数,将其转换为16 进制数并在屏幕中显示出来,要求判断输 入字符串是否为在0~65535 之间的十进制数。

(2)复习TD 各种操作,并用DEBUG 调试程序,学会基本命令操作,并通过单步、设置断点等方法观 察中间结果,完成正常运行。

命令行方式下直接键入debug myfile.exe 回车(myfile 为待调试可执行程序),进入调试方式(显示 -),键入H 回车显示全部命令、格式和功能。常用命令有:U(反汇编)、A(汇编输入指令程序)、R(寄 存器显示/修改)、I(端口输入)、O(端口输出)、D(显示数据)、E(修改数据)。

除资源修改管理功能外,重点应用T(单步)、Tn(执行n 步)、P(过程/指令)、G××××(从当前CS:IP 执行到断点××××)或G=××××1 ××××2(从××××1 执行到××××2 断点)调试实验程序。

二. 基本实验原理(或基本原理)

(含简单文字叙述,关键电路原理图,程序框图) 同实验一

(1)小写字母的ASCII 码比其所对应的大写字母的ASCII 码值大20H,如字符“a”的ASCII 码为61H, 而字符“A”的ASCII 码为41H,因此字符变换时将小写字母的ASCII 码减去20H 即为大写字母的ASCII 码。 同样将数字转换为ASCII 码的方法为:将其值加上30H。

(2)键盘输入字符串:采用DOS 系统功能调用(INT 21H),功能号为AH=0AH,DS:DX 为存放键入字符串的缓冲区首地址,其中第一个字节需要初始化,为用户定义的缓冲区长度。当完成字符串输入并存储后,第二个字节为键入的字符串的个数,从第三个字节开始存放键入的字符串,并在最后有一个字节为0DH 作为字符串的结束。

(3)显示字符:采用DOS 系统功能调用(INT 21H),功能号为AH=02H,DL 中存放要显示字符的ASCII码;显示字符串:采用DOS 系统功能调用(INT 21H),功能号为AH=09H,DS:DX 存放要显示字符串的首地址,串尾字符为“$”但不显示出来。 (4)将10 进制数转换为16 进制数可采用按位取值再相加的方法,即(个位*1)+(十位*10)+(百位*100)+?,可用数值位数来判断位值。

(5)输入的十进制数,要求介于0~65535,因此缓冲区长度可定为6 字节(第二字节要存放实际键入的字符数),数据段定义时可采用如下方式:input db 6,7 dup(0)。 (6)判断输入的是否为介于0~65535 之间的十进制数可分为两步:① 按位比较,如果某个字符不是0~9 则不符合条件;② 将数值计算累加后若溢出,表示输入数值大于FFFFH,则也不符合要求。

三. 方案实现与测试(或调试)

1

《微机实验及课程设计》实验报告

(含实验步骤—分步进行-调试-测试,关键/重要的程序片段,程序框架无需) 实验步骤:

(1)编写程序实现如下功能:

① 从键盘输入任意字符串后,存入自定义存储单元,判断处理后将字符串中小写字母转换为大写字母 (其他字符不变)并按原顺序将这些字符在屏幕上显示出来。

② 从键盘输入在0~65535 之间的十进制数,将其转换为16 进制数并在屏幕中显示出来,要求判断输 入字符串是否为在0~65535 之间的十进制数。

(2)复习TD 各种操作,并用DEBUG 调试程序,学会基本命令操作,并通过单步、设置断点等方法观

察中间结果,完成正常运行。

重要程序片段:

(1) 程序名:string.asm

;----------------------------------------------------------- ;字符串的变换和输入输出

;-----------------------------------------------------------

main proc far

start: mov ax,data ;初始化各段基址

mov ds,ax

; mov ax,stacks ; mov ss,ax

loop1: mov dx,offset string1 ;显示提示信息

mov ah,09h int 21h

mov dx,offset input ;输入字符串 mov ah,0ah int 21h

mov dx,offset string2 mov ah,09h int 21h

call disp ;调用处理显示子程序 mov dx,offset string3 mov ah,09h int 21h mov ah,01h int 21h

cmp al,'y' ;判断是否继续 jz loop1 mov ah,4ch int 21h

main endp

;--------------------------------------------------------------------- disp proc near ;显示子程序

xor cx,cx ;input 为输入缓冲区,input[0]=最大允许输入字符数

mov cl,input[1] ;将输入的字符个数赋给cl,循环次数;input[1]=实际输入字符数 mov si,2 ;input[2]开始为实际输入字符ASCII 码

2

《微机实验及课程设计》实验报告

again: mov dl,input[si]

cmp dl,61h ;判断是否为小写字母 jb next cmp dl,7ah ja next

sub dl,20h ;将小写字母的ASCII 码转换为大写字母的ASCII 码

next: mov ah,02h ;显示字符

int 21h

inc si ;si 指向下一个字符 loop again ret disp endp

code ends end start

(2)程序名:num.asm

;---------------------------------------------------------------------- ;10 进制数转化为16 进制数

;---------------------------------------------------------------------- main proc far

start: mov ax,data ;初始化各段基址

mov ds,ax mov ax,stacks mov ss,ax

loop1: mov output,0000h ;清零

mov dx,offset string1

mov ah,09h

int 21h

mov dx,offset input ;输入数值 mov ah,0ah int 21h mov right,1

call change ;调用转换子程序

cmp right,0 ;判断数值是否满足条件 jz error

mov dx,offset string2 mov ah,09h int 21h

mov ax,output ;将转换后的16 进制数赋给ax mov dl,ah ;显示最高位 mov cl,4 shr dl,cl call disp

mov dl,ah ;显示第二位 and dl,0fh

3

《微机实验及课程设计》实验报告

call disp

mov dl,al ;显示第3 位 mov cl,4 shr dl,cl call disp

mov dl,al ;显示最后一位 and dl,0fh call disp jmp go

error: mov dx,offset string4 ;提示输入数值不满足条件

mov ah,09h int 21h

go: mov dx,offset string3

mov ah,09h int 21h mov ah,1 int 21h

cmp al,‘y’ ;判断是否继续 jz loop1 cmp al,‘Y’ jz loop1

mov ah,4ch ;返回DOS 操作系统 int 21h main endp

;----------------------------------------------------------------- change proc near ;数值转换子程序 clc ;进位标志清零 xor ax,ax ;寄存器清零 xor bx,bx xor dx,dx

mov cl,input[1] ;将数值位数赋给cl mov si,2 ;初始化si

again: mov bl,input[si] ;依次将每位数字赋给bl

cmp bl,30h ;判断是否为0~9,不是right 置0 jb error1 cmp bl,39h ja error1 sub bl,30h dec cl cmp cl,0 jz over mov ax,1 push cx

loop2: mul ten ;计算位数乘值(1,10,100?)

4

《微机实验及课程设计》实验报告

loop loop2 pop cx mul bx

add output,ax ;将值累加 jc error inc si jmp again

over: add output,bx jnc over1

error1: mov right,0 over1:ret change endp

;---------------------------------------------------------------- disp proc near ;显示子程序 push dx push ax

cmp dl,9 ;判断是0~9 还是A~F jbe num add dl,7 num:add dl,30h mov ah,02h int 21h pop ax pop dx ret disp endp

code ends end start

实验现象:

分步进行: 调试string.exe:

5

《微机实验及课程设计》实验报告

运行结果:

调试num.exe:

运行结果:

6

《微机实验及课程设计》实验报告

四.提高与创新研究

(说明提高与创新部分实验情况,简述实验步骤,电路和关键/重要的程序片段) 1)利用带符号调试开关/Zi 和链接开关/v, 进行编译连接,并用TD.EXE 进行调试,尝试直接对符号 变量进行修改、检查操作;

2)程序(2)中,在输入数值时采用按位判断方法,即每位数字输入时判断,如果不符合则拒绝输入该 字符,并将符合的字符存入; 3)如何合理地利用断点技术。

五.分析与总结

(总结现象,分析原因和结果,评价实验(设计/效果/调试/测试方法))

本次实验花费了较长时间,其中在修改调试程序上花费时间占绝大部分。虽然用的是参考程序,但还是得检查程序编译的正确性。程序编译出错主要出现在语法错误上,不过这些错误很少,容易修改。其次是一步一步运行程序,一开始没有注意,全部用的是t来执行单步运行,结果发现有些程序段被跳过了,这是由于t仅仅单步执行当前指定地址处的指令,忽略了程序中断时的那部分程序运行,所以在执行中断程序时,我用p来执行,结果正确。

虽然,实验花了很长时间修改,解决种种问题才能够输出正确结果,但我觉得不断的找出错误并修正错误这个过程更能锻炼人,学到的东西更多。

7

本文来源:https://www.bwwdw.com/article/nilg.html

Top