ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:554.72KB ,
资源ID:4382048      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4382048.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(北邮微原软件实验.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

北邮微原软件实验.docx

1、北邮微原软件实验微机原理软件实验报告学院:信息与通信工程学院班级:学生姓名:学号:实验一 DEBUG 的使用实验目的 1.掌握汇编程序的编辑,编译,连接和执行的全过程;2.学习和掌握用DEBUG调试程序的方法.实验任务及内容及对应操作 1.用编辑软件,输入以下汇编语言源程序: DAT SEGMENT A DB 20 ;(自定) B DB 15 ;(自定) Y DB 3 DUP(0) Z DB 0,0 DAT ENDS STA SEGMENT STACK DW 50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PU

2、SH DS XOR 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 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WORD PTR Y,AX 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

3、 BYTE PTRY+2,0 RET SUB1 ENDP COD ENDS END STAR2.通过编译,连接形成可执行文件. 3.用 DEBUG 将可执行文件调入,并进行调试. (1)用 D 命令观察数据区在内存中的具体内容,记录单元 A 和 B 的具体地址. (2)用 U 命令对目标代码反汇编,观察反汇编后的结果.注意发现源程序的起始位置, 并记录这个起始地址. 可见:A和B的具体地址为:076A:0000 和 076A:0001 源程序的其实地址为:0772:0000 (3)用 T 命令作单步跟踪调试.比较每条指令执行后的结果和原来的理解是否一致.得出程序运行的结果:它们是写在什么单元,

4、具体内容是什么; 并判断结果是否正确. (4)在子程序 SUB1 的入口处设一断点,用 G 命令执行程序. 在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致. (5)用 E 命令修改单元 A,B 的内容,重新执行程序,并记录结果. (6)用 M 命令和 A 命令对程序进行修改: 将主程序中最后两条指令 (ADD 和 ADC) 修改为一条 CALL SUB1 指令,重新执行程序.将ADD和ADC两条语句替换为CALL语句,通过A命令可以直接修改程序指令,通过插入NOP指令使CPU空闲。 (7)退出 DEBUG. 4.重新使用编辑软件,把源程序最后一句中的 STAR 去掉.再次生成可执

5、行文件,并用 DEBUG 调入内存.当使用 U 命令时,显示的结果与前一次(未加 STAR) 的结果有何不同?重新使用编辑软件,把源程序最后一句中的 STAR 去掉。再次生成可执行文件。再次DEBUG。当使用 U 命令时,结果如下图所示。可以看到,程序直接从数据段开始译码,后续译码全部紊乱。所以说END STAR的作用是指示编译器程序结束,同时告诉编译器程序执行时代码段的入口地址。回答预习题1. 熟悉常用的 DEBUG 命令.2. ? 帮助3. r 查看寄存器内容4. r xx (xx:寄存器名称), 修改寄存器内容5. d xx:偏移地址(xx为cs ds sses) 查看内存单元的内容6.

6、 u 地址 反汇编7. t=开始地址结束地址 跟踪执行8. p 跳过子程序单步运行9. g=开始地址断点地址 执行到断点处10. g 全速运行11. e xx:偏移地址(xx为cs ds sses) 修改内存单元的内容12. a 偏移地址 汇编,录入程序或可修改语句13. m xx:块开始地址块结束地址xx:新块开始地址 块搬移:又相当于复制命令(xx为cs ds sses)14. q 退出debug阅读并分析程序的功能.答:程序完成的功能是计算两个数的完全平方和,即计算。 3.若 SS=2000H,SP=FFFFH, 向堆栈中压入 4 字节数据后,如何用 D 命令显示压入堆栈的内容?答:使用

7、的命令是:-D 2000:FFFB,即使用段基址加偏移量查看。实验总结实验一,是这次微原软件实验的基础,我主要学习了代码的链接及可执行文件的生成也学习并熟悉了DEBUG的使用,尝试使用的其中的部分指令。通过DEBUG时查看程序内部运行的情况,我对课本上学习到的微原知识有了更深刻的理解。实验二分支,循环程序设计一、实验目的1.开始独立进行汇编语言程序设计;2.掌握基本分支,循环程序设计;3.掌握最简单的 DOS 功能调用.二、实验任务及内容1.安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过 9。2.编写一个程序统计数据区中正数,负数和零的个数。3.将统计结果在屏幕上显示。4.(

8、扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。三、程序流程图四、源程序DAT SEGMENT NUM DW 1,-1,3,0,-6,-5,-4,3,-6,8,0,-8,-1,9,-7,0,9 ;设定的一组数据,其中3个0,6个正数,8个负数,符合题目要求 N DW ($-NUM)/2 ;该组数据的个数 Z DW 0 ;数据中0的个数 A DW 0 ;数据中大于0的个数 B DW 0 ;数据中小于0的个数 TYPE0 DB 0DH, 0AH, Number of zeros : $ TYPE1 DB 0DH, 0AH, Number of greater than 0 : $ TYP

9、E2 DB 0DH, 0AH, Number of less than 0 : $ LOCATE DW TYPE0, TYPE1, TYPE2DAT ENDSSTA SEGMENT STACK DW 128 DUP(?)STA ENDSCOD SEGMENT ASSUME DS:DAT, SS:STA, CS:CODSTAR: MOV AX, DAT MOV DS, AX MOV AX, STA MOV SS, AX ;初始化DS、SS指向STA MOV BX, OFFSET NUM ;将NUM中第一个数字的地址送入BX MOV CX, N ;将NUM中数字个数送入CXTEST: MOV AX

10、, BX ;取出NUM中的第一个数字 CMP AX, 0 JZ IFZ ;判断结果为是0,跳转到IFZ处继续执行 SAL AX, 1 JC IFL ;判断结果是小于0,跳转到IFL INC WORD PTR A ;否则,A自加,然后继续执行程序 JMP CONTINUEIFL: INC WORD PTR B ;B自加 JMP CONTINUEIFZ: INC Z ;Z自加 CONTINUE: ADD BX, 2 ;继续送入下一数字 LOOP TEST ;循环CX次判断 MOV CX, 3 ;共显示3句话 XOR BX, BXSHOW: MOV DX, LOCATEBX ;显示一句话 MOV A

11、H, 09H INT 21H MOV DX, ZBX ADD DX, 0 MOV AH, 02H INT 21H ;加上ASCII码,显示Z、A、B的值 ADD BX, 2 LOOP SHOW MOV AX, 4C00H INT 21H ;返回DOS系统COD ENDSEND STAR五、程序运行结果显示有3个0、6个大于0的数、8个小于0的数,与预期结果符合六、预习题 1.十进制数 0 - 9 所对应的 ASCII 码是什么? 如何将十进制数 0 -9 在屏幕上显示出来? 答:0-9对应的ASCII码是30H39H,即对应的数值加上30H即可得到其对应的ASCII码。要显示时将对应的ASCI

12、I码赋给DX,之后用2号功能调用即可。2.如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:先检验其ZF位,再检验其SF位,即直接检验该数字。将待判断的数与0比较,同样先检验ZF,再检验CF位。七、实验总结、建议要求、心得体会本次试验中,主要用到运用的是分支、循环结构,所以程序中存在很多条件跳转语句。所以需要在最初设计时就考虑好各种分支情况,这是程序流程图的重要作用就显现出来了。在刚开始编这个程序的时候,我只是凭借自己的抽象思维来想象这个过程,导致过程特别混乱。我意识到这一点之后,经过仔细的思考,在画好程序流程图之后,程序的编写工作变得简单了很多,简化了编写代码过程中的思考过程。

13、我个人觉得,这说明程序流程图在汇编语言编写过程中的作用比别的高级语言显得更加重要。实验三代码转换程序设计一、实验目的1.掌握几种最基本的代码转换方法;2.运用子程序进行程序设计.二、实验任务及内容1.从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来.2.两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明.3.对输入要有检错措施,以防止非法字符输入,并有适当的提示.4.将整个程序分解为若干模块,分别用子程序实现.在报告中要给出模块层次图.三、程序流程图 四、源程序DATA SEGMENTREMIND DB 0DH,0AH,Please input the numbe

14、rs to be compared now.,0DH,0AH,The numbers should be devided with SPACE and ended with ENTER,0DH,0AH,$ERROR DB 0DH,0AH,INPUT ERROR,0DH,0AH,$STR DB 0DH,0AH,compared result:the minimum is:,0DH,0AH,$MIN DB 9,9DATA ENDS ;设置最初输入提醒、错误提示、结果输出、初始化最小值为99。STACK SEGMENT STACK STACK DB 100 DUP(?)STACK ENDSCODE

15、SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACKINPUT PROC NEAR ; 控制输入的子程序 MOV AH,01H ; 非法输入则将AL = 0后返回 INT 21H CMP AL,0 JB FLAG CMP AL,9 JA FLAG RET FLAG: MOV AL,0 RETINPUT ENDPSTART: MOV AX,DATA MOV DS,AX ;初始化数据段DSLOOP1: MOV AH,09H MOV DX, OFFSET REMIND ;显示输入提示的字符串 INT 21HLOOP2: CALL INPUT ; 调用输入子程序,输入十位数

16、CMP AL,0 ; 错误则输出提醒JZ ERR MOV DH,AL CALL INPUT ; 调用输入子程序,输入个位数 CMP AL,0 ; 错误则输出提醒JZ ERR MOV DL,AL MOV AH,1 INT 21H CMP AL,0DH JZ EXIT ;判断是结束符“.”则跳转 CMP AL,20H ;判断是分隔符才继续 JNZ ERR CMP DX,WORD PTR MIN ;比较较小值,是则跳转并刷新最小值 JB SWAP JMP LOOP2EXIT: MOV AH,09H ; 显示最小值的那句话,即显示字符串 MOV DX,OFFSET STR INT 21H MOV AH

17、,02H MOV DL,MIN+1 ;显示最小值的十位 INT 21H MOV AH,02H MOV DL,MIN ;显示最小值的个位 INT 21H MOV AX,4C00H ;返回DOS系统 INT 21HSWAP: MOV WORD PTR MIN,DX ; 刷新最小值 JMP LOOP2ERR: MOV DX,OFFSET ERROR ;输入错误时跳至此处,输出提示,即显示对应字符串 MOV AH,09H INT 21H JMP LOOP1CODE ENDS END START注:本程序中,中断字符为空格键,结束字符为回车键。五、程序运行结果六、预习题1. 如何将输入的两个字符(09)

18、变为十进制或二进制数?答:输入的字符09是ASCII码表示的,对应于30H39H,通过减去30H,可以转换为相应的计算机数,即转换成功。2. 如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?答:可以按对应的ASCII码转换为数字即可,规律如1所示。在本次试验中可以采用输入时把ASCII码转换为数字,然后比较数字的大小再输出,但是这一天的话输出时还需要把数字再次转换为ASCII码。很显然这样会造成代码的冗余,所以在我的代码中直接读入并存储数字的ASCII码,再直接比较其大小,然后直接输出ASCII码。这样的话,虽然在程序中没有出现对应的十六进制或十进制数字,但是输入及显示输出

19、的内容是正确的,对程序结果并无影响。3. 你觉得采用二进制运算还是十进制运算更适合于这个实验?答:如果在这两种禁止里进行选择的话,我觉得二进制(十六进制)更好一些,因为这样更符合机器语言,有利于程序的编写。但是采用二进制或者十进制都需要进行ASCII码到数字的转换和其反向转换,换用新的思路可以大大简化编程负担。所以我选择了直接使用数字对应的ASCII比较,分别比较十位和个位,最后直接输出字符即可。七、实验总结、建议要求、心得体会这个实验主要涉及到代码转换的程序,编程过程中遇到的主要的问题就是关于ASCII码转换的问题,由于不熟悉出现了很多不该犯的错误。另外,这次的程序依然用了很多的跳转,导致程

20、序有点乱,由于实验4就是关于这个的,所有就没有对其进行改进,在实验4中,这方面有了比较大的进步。实验四子程序设计一、 实验目的1.进一步掌握子程序设计方法;2.进一步掌握基本的 DOS 功能调用.二、实验任务及内容1.从键盘上输入某班学生的某科目成绩.输入按学生的学号由小到大的顺序输入.2.统计检查每个学生的名次.3.将统计结果在屏幕上显示.4.为便于观察,输入学生数目不宜太多,以不超过一屏为宜.输出应便于阅读.尽可能考虑美观.5.输入要有检错手段.三、程序流程图结束合理输出子程序调用输出子程序调用排序子程序检验子程序调用检验子程序四、源程序 DATA SEGMENT BUFFER DB 10

21、0DB ?DB 10 DUP (?) STR1 DB please input the score of the students devided with space:,0DH,0AH,$ STR2 DB error,please input the score again:,0DH,0AH,$ STR3 DB num rank scor ,0DH,0AH,$ ;定义各提示语句的字符串VAR1 DW ?VAR2 DW ?CK DB ? TAB DB 100 DUP(?) DATA ENDS STACK SEGMENT STACK stack DB 100 DUP (s) STACK ENDS

22、 CODE SEGMENT PARA code ASSUME CS:CODE,DS:DATA,SS:STACK STA PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,09H INT 21H ;显示输入提示语句,即送显STR1字符串 INPUT: LEA DX,BUFFER ;开始扫描输入并进行存储 MOV AH,0AH INT 21H LEA DI,TAB XOR CX,CX MOV AH,30H MOV DH,31H LEA BX,BUFFER+2 CALL CHECK ;调用检验子程序

23、 CMP CK,1 JZ INPUT CALL COM ;调用排序子程序 MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H LEA DX,STR3 MOV AH,09H INT 21H CALL DISPY ;调用子程序送显程序结果 RET STA ENDP CHECK PROC ;检验子程序 NEXT1: MOV CK,0 MOV DI,AH INC DI MOV DI,DH INC DI CMP DH,39H JZ L1 INC DH JMP L2 L1: MOV DH,30H INC AH L2: MOV AL,BX

24、CMP AL,30H JB ERROR CMP AL,39H JA ERROR MOV DI,AL INC DI INC BX MOV AL,BX CMP AL,30H JB ERROR CMP AL,39H JA ERROR MOV DI,AL INC DI INC BX INC CX MOV AL,BX CMP AL,0DH JZ FINISH1 INC BX JMP NEXT1 ERROR: LEA DX,STR2 MOV AH,9 INT 21H MOV CK,1 FINISH1: RETCHECK ENDP COM PROC ;调用排序子程序 COMP1: PUSH CX MOV V

25、AR1,CX SHL CX,1 SHL CX,1 SUB CX,4 MOV VAR2,CX POP CX DEC DI DEC DI JMP COTI COMP2: ADD DI,VAR2 COTI: MOV BL,0 MOV CX,VAR1 DEC CX AGAN: MOV AL,DI CMP AL,DI-4 JA GOON1 JB GOON3 INC DI MOV AL,DI CMP AL,DI-4 PUSHF DEC DI POPF JA GOON1 JBE GOON3 GOON1: MOV BL,-1 PUSH CX MOV CX,4 DEC DI DEC DI GOON2: MOV

26、AL,DI XCHG AL,DI-4 MOV DI,AL INC DI LOOP GOON2 POP CX DEC DI DEC DI GOON3: DEC DI DEC DI DEC DI DEC DI LOOP AGAN CMP BL,0 JNZ COMP2 DEC DI DEC DI MOV CX,VAR1 MOV BH,30H MOV BL,31H RETCOM ENDP DISPY PROC ;送显子程序 DISPY1: MOV DL,BH MOV AH,02H INT 21H MOV DL,BL MOV AH,02H INT 21H MOV DL, MOV AH,02H INT 2

27、1H INT 21H INT 21H MOV DL,DI MOV AH,02H INT 21H INC DI MOV DL,DI MOV AH,02H INT 21H INC DI MOV DL, MOV AH,02H INT 21H INT 21H INT 21H MOV DL,DI MOV AH,02H INT 21H INC DI MOV DL,DI MOV AH,02H INT 21H INC DI MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H CMP BL,39H JZ L3 INC BL JMP NEXT2

28、L3: MOV BL,30H INC BH NEXT2: LOOP DISPY1 RETDISPY ENDPCODE ENDS END STA五、程序运行结果六、预习题1.如何确定一个学生在这门科目中的名次?答:根据输入成绩进行排序,完成后看最后这个学生的位置来确定其名次2.你觉得输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:冒泡排序法3.准备好模块层次图.4.给出输出显示的形式.答:输出形式以列表形式给出。序号、名次、分数各一列。如结果图所示。七、实验总结、建议要求、心得体会本次实验主要涉及到的是子程序的调用,从这次实验中我体会到了子程序调用对程序的的简洁与清晰有巨大的作用,不像前面靠各种JMP来实现跳转进,是整个程序显得很杂乱。在此次实验完成之后,我的编程能力以及对汇编语言的了解都获得了加深,对于微机原理课程的学习以及之前所学的知识的巩固都有很大的左右。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1