微机原理与接口技术实验_第1页
微机原理与接口技术实验_第2页
微机原理与接口技术实验_第3页
微机原理与接口技术实验_第4页
微机原理与接口技术实验_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、word一、 实验目的与要求实验目的:掌握汇编语言程序设计的根本方法实验要求:设有九个学生某门课的成绩存放在数据区中。试编制一个程序,统计低于60分,6069分,7079分,8089分,9099分和100分的人数,并输出显示统计结果。二、 实验方案用汇编语言编程时将程序分成代码段、数据段、堆栈段。需要独立运行的程序必须包含一个代码段,并指示程序执行的起始位置。需要执行的可执行性语句必须位于某一个代码段内,说明性语句通常安排在数据段或根据需要安排在其他段。本程序将需要显示的各分数段的信息和对应的计数器定义在代码段,分别定义9个dword类型数据64 ,75 ,98 ,100 ,105 ,87 ,

2、59 ,57 ,81用以表示分数的大小,定义8个字节类型的数据显示各个分数段的人数,同时也定义7个字节类型的计数器统计6个分数段以及输入分数数据错误的学生人数。利用微机中cmp指令比拟使目的操作数减去原操作数,但是差值不送回目的操作数,但按照减法结果影响状态标志。条件转移指令jcc和无条件转移指令jmp指定程序的转移过程。其中无条件转移指令无任何先决条件就能使程序改变执行书序;jcc指令确定程序是否发生转移。如果满足条件,那么程序转移到目标地址去执行;如果不满足条件,那么程序顺序执行下一条指令。本程序主要利用的条件转移指令有jl小于指令和jg大于指令。源程序的开发过程都需要编辑、汇编、连接等步

3、骤。首先利用记事本文本编辑器编辑程序,并形成一个以 .ASM位扩展名的源程序文件,然后用汇编程序翻译源程序,将 .ASM位后缀名的文件转换为 . OBJ目标模块文件;最后用一个连接程序将一个活多个目标文件连接成一个 .EXE可执行文件。本程序具体操作是:将一个MASM软件包拷在D盘根目录下,将编辑好的ASM文件复制在MASM目录下,双击WIN32图标,输入make32 e回车,在出入e回车即可得到统计结果。三、 汇编思想1数据段.data段的定义 在数据段中定义分别定义DWORD类型的学生成绩、8个BYTE类型的数据显示提示信息输出的信息、定义7个BYTE类型的数据记录每个分数段的学生人数2代

4、码段.code说明start是一个“标号性质的参数,用于指定程序开始执行于该标号所指示的指令。而程序的最后需要有一条汇编语句END作为结束的标志,说明之后的语句不会被汇编程序所汇编。其中汇编结束说明汇编程序到此结束将源程序翻译成目标模块代码的过程,而不是指程序终止执行。根据题目的要求需要统计各分数段的人数,可以用lengthof操作和MOV指令获得双字量的的数组长度并将其原位置传送到目的位置并保存在存放器ECX中,并定义ESI表示数据在变量中的偏移地址,用存放器相对寻址的方式获得变量的偏移地址,其中mov eax,scoresesi*(type scores)语句相当于EAX= scores+

5、 esi*4,因为程序开始执行时ESI为0,所以用scores数组中的第一个数和0相作比拟用条件转移指令jl判断是否小于0,如果小于0,那么程序跳转到flags0执行执行add count7,1使count7的值加1并返回保存count7,然后用无条件转移指令jmp跳转到next出执行inc esi使esi值自动加1,即指向数组中的下一个数,并用loop循环指令跳转到again处循环。如果和0相比拟不满足小于0条件那么顺序执行。在与60、70、80、90、100作比拟,并判断是否满足小于。如果小于跳转到各自标志处执行,是计数器加1,并根据无条件转移指令跳转到next处执行,使ESI自动加1,指

6、向数组中下一个数并在此循环。如果不满足顺序执行。最后调用MOV指令使EAX存放器指向每个需要提示信息的偏移地址,调用call dispmsg显示字符串信息。指令xor eax,eax操作使EAX清零。指令mov al,count6获得count1的数据,调用call dispsid显示有符号十进制数据。四、 程序代码: include io32.inc ;包含32位输入输出文件 .data ;数据段 scores DWORD 64 ,75 ,98 ,100 ,105 ,87 ,59 ,57 ,81 ;数组 output1 byte '不及格0-59的人数是: ',0 outpu

7、t2 byte '及 格60-69的人数是: ',0 output3 byte '中 等70-79的人数是: ',0 output4 byte '良 好80-89的人数是: ',0 output5 byte '优 秀90-99的人数是: ',0 output6 byte '满 分 100 的人数是: ',0 output7 byte '输 入 分 数 错 误 个数: ',0 output8 byte '输入的成绩分别为: ',0 count1 byte 0 ;0-59段人数计数器 c

8、ount2 byte 0 ;60-69段人数计数器 count3 byte 0 ;70-79段人数计数器 count4 byte 0 ;80-89段人数计数器 count5 byte 0 ;90-99段人数计数器 count6 byte 0 ;100段人数计数器 count7 byte 0 ;错误分数段人数计数器 .code ;代码段start: mov ecx,lengthof scores ;ECX=scores的长度 变量数组长度每次循环后ecx减1 mov esi,0 ;ESI=0,用于表示数据在变量中的位移量 mov eax,offset output8 ;指定字符串output8的

9、偏移地址 call dispmsg ;显示字符串以0结尾 call dispcrlf again: mov eax,scoresesi*(type scores) ;存放器相对寻址,type score即为DWORD的大小为4 call dispsid call dispcrlf cmp eax,0 ;跟0 比拟大小 jl flags0 ;判断是否小于0,小于0,程序转移到flags0执行,不满足那么顺序执行下一条指令 cmp eax,60 ;跟60比拟大小 jl flags1 ;判断是否小于60,小于60,程序转移到flags1执行,不满足那么顺序执行下一条指令 cmp eax,70 ;跟7

10、0比拟大小 jl flags2 ;判断是否小于70,小于70,程序转移到flags2执行,不满足那么顺序执行下一条指令 cmp eax,80 jl flags3 cmp eax,90 jl flags4 cmp eax,100 jl flags5 ;判断是否小于100,小于100,程序转移到flags5执行,不满足那么顺序执行下一条指令 je flags6 ;判断是否等于100,等于100,程序转移到flags6执行,不满足那么顺序执行下一条指令 jg flags7 ;判断是否大于100,大于100,程序转移到flags7执行,不满足那么顺序执行下一条指令 flags0: add count7

11、,1 jmp next flags1: add count1,1 jmp next flags2: add count2,1 jmp next flags3: add count3,1 jmp next flags4: add count4,1 jmp next flags5: add count5,1 jmp next flags6: add count6,1 jmp next flags7: add count7,1 jmp next next: inc esi ;指向下一个数 loop again ;循环处理 OUTPUT: call dispcrlf ;回车换行 mov eax,off

12、set output6 ;指定字符串output1的偏移地址 call dispmsg ;显示字符串以0结尾 xor eax,eax ;异或使eax为0 mov al,count6 ;al获得count1的数据 call dispsid ;显示有符号的十进制整数 call dispcrlf ;光标回车换行,到下一行首位置 mov eax,offset output5 call dispmsg xor eax,eax mov al,count5 call dispsid call dispcrlf mov eax,offset output4 call dispmsg xor eax,eax m

13、ov al,count4 call dispsid call dispcrlf mov eax,offset output3 call dispmsg xor eax,eax mov al,count3 call dispsid call dispcrlf mov eax,offset output2 call dispmsg xor eax,eax mov al,count2 call dispsid call dispcrlf mov eax,offset output1 call dispmsg xor eax,eax mov al,count1 call dispsid call di

14、spcrlf mov eax,offset output7 call dispmsg xor eax,eax mov al,count7 call dispsid exit 0 ;程序正常执行结束 end start ;汇编结束五、 实验结果和数据处理运行结果如下列图: 根据数据段定义的数据可以看出不及格人数为2人,及格人数为1人,中等人数为1人,良好人数为2人,优秀人数为1人,总分值人数为1人,错误分数数据位1人, 程序运行结果和输入数据分析可以看出结果是正确的。六、 问题与讨论1、 本程序利用的加法指令ADD和INC实现数组元素中的元素逐次加1操作,但是ADD指令使目的操作数加上源操作数,

15、和的结果送到目的操作数。而INC指令只有一个操作数,对操作数加1 再将结果返回操作数 add esi , 1 ;esi =esi + 1 inc esi ;esi =esi + 1但是INC不影响进位标志CF外,ADD指令按照定义影响全部状态标志位,即按照结果相应设置各个状态标志位0或1。2 、 程序中循环指令loop可以用下面两条语句代替dec ecx jnz again 其运行结果仍正确。其loop指令就是使用ECX存放器作为计数器,每次执行一次loop指令,ecx减1,然后判断ecx是否为0;如果不为0,表示循环没有结束,那么转移到指定的标号处;如果为0,表示结束,那么顺序执行下一条指令。七、 心得体会 微机原理与接口技术的课程只有通过自己编写、运行程序,菜可以稳固了所学过的知识,以前对于编程工具的使用还处于一知半解的状态上,但是经过一段上机的实践,对于怎么去排错、查错,怎么去看每一步的运行结果,怎么去了解每个存放器的内容以确保程序的正确性上都有了很大程度的提高。前两个个简单程序,加深了我们对初学的汇编语言指令的熟悉和理解,汇编

温馨提示

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

最新文档

评论

0/150

提交评论