北京邮电大学-微机原理软件实验报告_第1页
北京邮电大学-微机原理软件实验报告_第2页
北京邮电大学-微机原理软件实验报告_第3页
北京邮电大学-微机原理软件实验报告_第4页
北京邮电大学-微机原理软件实验报告_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理软件实验报告学 院: 信息与通信工程学院班 级: XXXXXX姓 名: XXXXX学 号: XXXXXXXX班内序号: XXXXX日 期: 2021年11月30日目录微 机 原 理 软 件 实 验 报告11.实验一32.实验二73.实验三134.实验四205.实验五306.总结及结论397.参考文献39实验一 DEBUG的使用一、 实验目的: 1.掌握汇编程序的编辑,编译,连接和执行的全过程; 2.学习和掌握用DEBUG调试程序的方法.二 、实验内容:1. 用编辑软件,输入以下汇编语言源程序:DAT SEGMENT ;默认ds段 A DB 20 ;(自定) B DB 15 ;(自定)

2、Y DB 3 DUP(0) Z DB 0,0DAT ENDS STA SEGMENT STACK DW 50 DUP(?)STA ENDSCOD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX ;AX清零 PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 ;A*A MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 ;A*A+B*B MOV AL,A MOV Z,AL

3、MOV AL,B MOV Z+1,AL CALL SUB1 ;A*A+B*B+A*B ADD WORD PTR Y,AX ;A*A+B*B+A*B +A*B -> (A+B)2 ADC BYTE PTRY+2,0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET SUB1 ENDP COD ENDSEND STAR2.通过编译,连接形成可执行文件。3.用DEBUG 将可执行文件调入,并进行调试。 (1)用 D 命令观察数据区在内存中的具体内容,记录单元 A

4、和 B 的具体地址。 (2)用 U 命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始 位置, 并记录这个起始地址。 (3)用 T 命令作单步跟踪调试.比拟每条指令执行后的结果和原来的理解是否 一致。得出程序运行的结果:它们是写在什么单元,具体内容是什么; 并判断结果是否正确。 (4)用 E 命令修改单元 A,B 的内容,重新执行程序,并记录结果。 (5)退出 DEBUG。三、预习题:1.熟悉常用的 DEBUG 命令。 2.阅读并分析程序的功能。答:程序实现了(A+B)2的功能。 3.假设 SS=2000H,SP=FFFFH, 向堆栈中压入 4 字节数据后,如何用 D 命令显示压入

5、堆栈的内容?答:使用指令“d 2000:0000即可显示压入堆栈的内容,因为SP+1 会溢出,所以变成0000。四、实验过程a.通过masm和link命令使得程序编译链接成功。b.进入debug中,用u命令查看反编译结果。得出A的地址为:076A:0000,值为14H,即十进制的20D;B的地址为:076A:0001,值为0FH,即十进制的15D。Y的偏移地址为0002H,Z的偏移地址为0005H。DATA段基地址为076AH。SUB1子程序段入口地址为003F。c.用e命令将A地址和B地址内的值由2AH,32H改为23H,24H,通过d命令重新查看A地址,B地址下的数值,发现改变成功。d.利

6、用t命令单步调试,可发现,每一步程序的执行,会与存放器及存储器的内容的变化是一致的。e.退出debug。五、实验总结由于之前上?操作系统?时,零散地学过一些汇编相关的内容,所以关于masm、debug的根本指令的使用还是比拟熟悉的,在做实验一的整个过程中也是比拟轻松。也希望自己能保持着这种轻松的状态去应对接下来的实验!实验二 分支、循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握根本分支,循环程序设计;3.掌握最简单的 DOS 功能调用。二、实验内容1.安排一个数据区,内存有假设干个正数,负数和零。每类数的个数都不超过 9。2.编写一个程序统计数据区中正数,负数和零的个数。3

7、.将统计结果在屏幕上显示。4.选做题统计出正奇数、正偶数,负奇数、负偶数以及零的个数。三、预习题1.十进制数 0 9 所对应的 ASCII 码是什么? 如何将十进制数 0 9 在屏幕上显示出来?答:09分别对应ASCII码的30H39H。因为屏幕上显示的数字是ASCII码,所以为了将十进制数09显示在屏幕上,需在原有的十进制数值根底上加上30H即可。2.如何检验一个数为正,为负或为零? 答:本实验中,判断正、负或零是直接用CMP命令和0比拟,然后用je、jg、jl等命令进行判断为正、负或零。四、实验流程图五、实验源代码;*;* 作者:LQ *;* 日期:2021/11/20 *;* 功能: *

8、;* 编写一个程序统计数据区中正偶数,正奇数,负奇数,负偶数和零的个数 *;*assume cs:code,ds:data data segment ;在db数据区,假定数字大小均在 -128127 之间,故每个数字用一个字节去存储 db -8,-10,-6,-5,-2,-55 ;给定6个负数,其中4个偶数,2个奇数 db 4 , 2, 3,78,89, 56 ;给定6个正数,其中4个偶数,2个奇数 db 0 , 0 ;给定2个零 db '$' ;设定一个结束符data endscode segment s1:db 5 dup(0) ;在代码段设置一块空间用于存储统计的最终数值

9、 db 'Positive Odd:','$' ;在代码段开出一块空间用于存储显示数据的字符串 db 'Positive Even:','$' db 'Negative Odd:','$' db 'Negative Even:','$' db 'Zero:','$' start: mov ax,data mov ds,ax xor di,di call main main: mov al,di cmp al,'$' je

10、 show cmp al,00H jg above0 ;带符号数的大于比拟 cmp al,0 jl below0 ;带符号数的小于比拟 jmp equal0 below0: mov bl,2 mov ah,0 idiv bl cmp ah,0 je nagative_even mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si+2 ;负奇数 inc di mov ds,cx call main nagative_even: ;负偶数 mov ax,cs mov cx,ds mov ds,ax mov si,offset

11、s1 inc byte ptr si+3 inc di mov ds,cx call main above0: mov bl,2 mov ah,0 idiv bl cmp ah,0 je positive_even mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si ;正奇数 inc di mov ds,cx call main positive_even: ;正偶数 mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si+1 inc di mov d

12、s,cx call main equal0: mov ax,cs mov cx,ds mov ds,ax mov si,offset s1 inc byte ptr si+4 inc di mov ds,cx call main show: ;显示数据 xor di,di mov ax,0B800H mov es,ax mov ax,cs mov ds,ax mov si,offset s1 add si,5 mov dx,0 mov bx,0 jmp print print: mov cl,si cmp cl,'$' je print_data mov byte ptr es

13、:di,cl inc di mov byte ptr es:di,07H ;07H代表颜色为黑底白字 inc di inc si jmp short print print_data: ;打印记录存储的数据值 push si mov si,offset s1 mov cl,bx add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,71H ;71H代表颜色为白底蓝字 cmp dx,640 je ending add dx,160 mov di,dx pop si inc si inc bx jmp print ending: mov

14、 ax,04c00H int 21Hcode endsend start六、实验过程及解释本次实验要求统计数据区内正奇数、正偶数、负奇数、负偶数、零的个数,首先将数据区的数值与0比拟,按数字的正、负或零的特性分别跳转至处理正数的子程序段、处理负数的子程序段、处理零的子程序段。其中,在处理正、负数的子程序段,对于正负数进行带符号的除二运算,通过判别余数是否为零判别该数是偶数还是奇数,并且判别后将各个对应的正奇数、正偶数、负奇数、负偶数、零的个数进行统计。程序在统计完所有类型的数的个数后,会向显存中写入数字,将统计好的数值以可视化形式呈现出来。编译运行程序结果如下:a. 通过masm和link命令

15、使得程序编译链接成功。b.由运行结果可看到与数据区设置的正奇数、正偶数、负奇数、负偶数、零的个数一致。七、实验总结这次实验相较于第一次实验而言,程序需要自己独立设计并且首次涉及到了向屏幕打印数据的程序编写。为了充分理解向屏幕打印数据的细节方面,我没有选择中断的调用去打印数据,而是自己往显存中直接写入数据并且在屏幕上呈现。为了编程实现字符向屏幕端的打印,我需要理解显存的数据存储,如一个ASCII码在屏幕端的显示需要两个字节,屏幕通常一行是显示80个字符,也即一行对应160个字节,同时要使得数据呈现时比拟美观,还需要自己设计换行等数值的运算,这些都花了我很多时间去调试,不过这也使得我更完整地理解了

16、显存的工作原理,为之后实验打下了根底。实验三 代码转换程序设计一、实验目的 1.掌握几种最根本的代码转换方法; 2.运用子程序进行程序设计。二、实验内容1.从键盘上输入假设干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。 2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。 3.对输入要有检错措施,以防止非法字符输入,并有适当的提示。 4.将整个程序分解为假设干模块,分别用子程序实现.在报告中要给出模块层次图。三、 预习题1.如何将输入的两个字符(09)变为十进制或二进制数?答:输入的字符09是ASCII码表示的,对应于30H39H,通过减去30H,可以转换为相应的二进制

17、数。2.如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?答:由于在数据区存储的最小数的数值为二进制数,同时要以十进制易于读的形式转化为ASCII码并显示,需要进行除十取商及取余运算,并将取出的二进制形式的商、余数加上30H,转化为对应的ASCII码值。3.你觉得采用二进制运算还是十进制运算更适合于这个实验?答:由于存储器、存放器中存储的数据形式都是二进制形式的,所以我觉得采用二进制运算更适于本实验,我在程序的设计、编写中也是采用了二进制运算。四、 程序流程图a. 模块层次图b.完整程序流程图五、程序源代码;*;* 作者:LQ *;* 日期:2021/11/22 *;* 功能

18、: *;* 输入假设干两位十进制数,寻找最小值,并打印至屏幕(默认十进制数均为正数) *;*assume cs:codedata segment db 'Wrong Input!','$' db ' ','$' ;前两行字符串,用于向屏幕打印发生错误时的字符串 db 127,0,0 ;用于存储输入的数字,并且于首位存储着最小的数值data endscode segmentmessage:db 'The minimum num is:','$' ;用于最后向屏幕打印最小值的字符串 start: mov

19、 ax,data mov ds,ax xor si,si mov di,1AH ;1AH对应着存储数字的区域 main: mov ah,0 ;int 16h 0编号功能是从键盘缓冲区读取一个键盘值输入 int 16h ;结果 ah存储扫描码,al 存储ascii码值 cmp ah,1cH ;1ch 为回车键的扫描码,一旦按下回车表示程序输入结束 je print_prog1 cmp ah,39H ;空格键的扫描键,作为两个十进制数之间的分隔符 je compare cmp ah,02H jb error cmp ah,0BH ja error call show add si,2 jmp sh

20、ort main show: inc di mov dx,0b800H ;将输入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si+1,07H sub al,30h mov di,al ret compare: mov dx,0b800H ;将输入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si+1,07H add si,2 mov al,di-1 mov bl,10 mul bl add al,di cmp al,di-2 jb minimum mov

21、 di,1AH jmp far ptr main minimum: mov di-2,al mov di,1AH jmp far ptr main print_prog1: ;作为中转,因为print_prog程序段超出了je跳转的范围 jmp print_prog error: ;调用第10号中断的2号子程序 mov ah,2 ;置光标 mov bh,0 mov dh,10 ;dh中放行号 mov dl,35 ;dl中放列号 int 10h mov dx,0 ;ds:dx 指向字符串的首地址 mov ah,9 ;使用int 21h号中断例程的9号子程序 ;功能为在光标位置显示字符串 提供要显

22、示的字符串的地址作为参数 ;要显示的字符串需用'$'作为结束符 int 21h mov cx,10H ;设置一个空循环,用于保持错误的提示一段时间 empty: loop empty mov ah,2 ;置光标 mov bh,0 mov dh,10 ;dh中放行号 mov dl,35 ;dl中放列号 int 10h mov dx,0DH ;ds:dx 指向字符串的空字符串地址 mov ah,9 ;使用int 21h号中断例程的9号子程序 ;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数 ;要显示的字符串需用'$'作为结束符 int 21h jmp

23、far ptr main print_prog:xor di,di add di,160 ;在屏幕的第二行打印输出最小值 mov ax,0B800H mov es,ax mov ax,cs mov ds,ax mov si,offset message mov dx,0 mov bx,0 jmp print print: mov cl,si cmp cl,'$' je print_data mov byte ptr es:di,cl inc di mov byte ptr es:di,07H ;07H代表颜色为黑底白字 inc di inc si jmp short print

24、 print_data: ;打印记录存储的数据值 mov ax,data mov ds,ax push si mov si,1AH mov cl,si ;取出最小数的数值 mov ch,0 mov ax,cx ;因为该数值在内存中是以十六进制存在的,要转化为易于理解的ascii码十进制的形式,需要进行除十取商和取余操作 mov bl,10 div bl mov cl,al ;获取除十取商后的值即十位上的数值并打印 add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,71H ;71H代表颜色为白底蓝字 inc di mov cl,a

25、h ;获取除十取余后的值即个位上的数值并打印 add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,71H ;71H代表颜色为白底蓝字 ending:mov ax,4c00H ;最终程序运行结束 int 21H code endsend start六、实验过程及解释1.本实验已完成的功能是:a.每次输入一个两位十进制数,按下空格后,会在存储最小值的数据区将刚输入的数值与当前的最小数值进行比对,并时刻在数据区存储当前的最小数。如果想要向屏幕打印当前所有输入的数字中的最小数的数值时,只需按下回车键,会将当前的最小值打印至屏幕。b.如果按

26、下错误的按键,屏幕中央会打印出输入错误的提醒,并且这个提醒只会显示几秒钟,类似于弹窗效果,真正起到了提示作用。2.程序调试结果:a.通过masm和link命令使得程序编译链接成功。b.正确输入的时候,在此例中,输出了最小数为02,其中02数字的显示为白底蓝字。c. 输入错误时,会在屏幕中间弹出“wrong Input!的警告,警告保持几秒后自动消失。七、实验总结本次实验,相较于上一个实验又是一个难度的提升,其中如何得到按键的值,并向屏幕打印出来对应的按键值,还需要了解按键中断触发的工作原理,而这一块在课堂上老师讲解得很浅,还需要自己去查阅相关的资料。本实验中,我在研读了王爽的?汇编语言?后选中

27、了int16中断的0号功能,关于此功能的调用与使用我也是花了一些时间去琢磨,但此功能在之后的几个实验中都有着极其重要的意义。此外,还有如何找到最小值,如何在按下不相关按键后提示错误输入并且只显示几秒,这些都用到了一些编程的小技巧,而这些小技巧都是我自己一点一点思索出来的,虽然功能很简单,但是在我看来,这些都是很有趣、很让我满足的。实验四 子程序设计一、实验目的: 1.进一步掌握子程序设计方法; 2.进一步掌握根本的 DOS 功能调用。二、实验内容: 1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入。 2.统计检查每个学生的名次。 3.将统计结果在屏幕上显示。4.为便于观

28、察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观。 5.输入要有检错手段。三、预习题: 1.如何确定一个学生在这门科目中的名次?答:此程序显然属于排序问题,从简单的排序算法思考,我首先选定使用冒泡排序算法或是插入排序算法,由于插入排序的特性就如同它所介绍的一样-我们在玩纸牌时,每一次抓牌前的纸牌都是排好序的,每一次插牌后也都是排好序的,按照这个特性去设计程序,可以很好地去贴合程序的设计。于是最后我选定插入排序去确定学生在科目中的名次。 2.你觉得输入结束后,采用什么方法进行比拟以得到学生的名次最为简单?答:因为本实验我所采取的是插入排序,所以最终输入结束后就已经得到了

29、最终学生的名次,所以输入结束后无需再采用别的算法去确定学生名次。3.准备好模块层次图。 4.给出输出显示的形式。 答:逐行显示,每行依次显示知名次、学号、成绩。四、 程序设计流程图五、程序源代码;*;* 作者:LQ * ;* 日期:2021/11/23 * ;* 功能: * ;* 输入假设干两位十进制数,对应着学生的科目成绩,按照科目成绩进行排序 * ;*assume cs:codedata segment db 'Wrong Input!','$' db ' ','$' ;前两行字符串,用于向屏幕打印发生错误时的字符串 db 9

30、0 dup(0) ;假定学生总数不大于45data endscode segmentmessage:db 'rank','$' start: mov ax,data mov ds,ax xor si,si mov di,19H ;19H对应着存储数字的区域前面一个区域 s: mov ah,0 ;int 16h 0编号功能是从键盘缓冲区读取一个键盘值输入 int 16h ;结果 ah存储扫描码,al 存储ascii码值 cmp ah,1cH ;1ch 为回车键的扫描码,一旦按下回车表示程序结束 je print_prog1 cmp ah,39H ;空格键的扫描键,

31、作为两个十进制数之间的分隔符 je storage cmp ah,02H jb error cmp ah,0BH ja error call show add si,2 jmp short s error: ;调用第10号中断的2号子程序 mov ah,2 ;置光标 mov bh,0 mov dh,10 ;dh中放行号 mov dl,35 ;dl中放列号 int 10h mov dx,0 ;ds:dx 指向字符串的首地址 mov ah,9 ;使用int 21h号中断例程的9号子程序 ;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数 ;要显示的字符串需用'$'作为结

32、束符 int 21h mov cx,10H ;设置一个空循环,用于保持错误的提示一段时间 empty: loop empty mov ah,2 ;置光标 mov bh,0 mov dh,10 ;dh中放行号 mov dl,35 ;dl中放列号 int 10h mov dx,0DH ;ds:dx 指向字符串的空字符串地址 mov ah,9 ;使用int 21h号中断例程的9号子程序 ;功能为在光标位置显示字符串 提供要显示的字符串的地址作为参数 ;要显示的字符串需用'$'作为结束符 int 21h jmp far ptr s show: ;输入结束后,打印出排名、学号、成绩 in

33、c di mov dx,0b800H ;将输入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si+1,07H sub al,30h mov di,al ret print_prog1: ;作为中转,因为跳转至print_prog的范围跨度超过了跳转的范围 jmp far ptr print_prog storage: ;每一次按下空格后,都会把数据存储,同时进行插入排序 mov dx,0b800H ;将输入的字符串打印至屏幕 mov es,dx mov byte ptr es:si,al mov byte ptr es:si

34、+1,07H ;对已经输入的数据进行处理,有ascii码值转化为实际的数值,以及添加其对应的学号 add si,2 mov al,di-1 mov bl,10 mul bl add al,di mov di,al mov ax,di sub al,1bH mov bl,2 mov ah,0 div bl inc al mov di-1,al cmp al,1 je once dec ax mov cx,ax mov bx,di mov dh,bxcompare: ;对插入的数据进行比对,找到该插入的位置 sub bx,2 cmp dh,bx jna exchange loop compare

35、jmp exchange once: ;有些特殊情况: ;比方比对位置发现此时的位置最适宜,以及第一次插入数据时肯定是有序的 ;这种情况便不再进行后续比对移动这些操作,直接等待下一次的输入 jmp far ptr s exchange: ;找到插入的位置后,将数据全部后移,腾出空位让应插入的数据插入 sub ax,cx mov cx,ax ;元素向后移动的次数为比拟的次数 mov ax,di dec ax mov bx,ax mov dh,di mov dl,di-1 jcxz once move: dec bx mov ah,bx mov bx+2,ah dec bx mov al,bx m

36、ov bx+2,al loop move mov bx+1,dh mov bx,dl jmp far ptr s print_prog:xor di,di add di,160 ;在屏幕的第二行打印输出最小值 mov ax,0B800H mov es,ax mov ax,cs mov ds,ax mov si,offset message mov dl,1 ;显示排名 mov bx,0 ;用于从数据区取出学号,成绩的标识 jmp print print: mov cl,si cmp cl,'$' je print_data mov byte ptr es:di,cl inc di mov byte ptr es:di,07H ;07H代表颜色为黑底白字 inc di inc si jmp short print print_data: ;打印 数据存储区存储的学号、成绩 ;打印排名 mov cl,dl add cl,48 mov byte ptr es:di,cl inc di mov byte ptr es:di,07H ;07H代表颜色为

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论