中南大学计算机原理与汇编课设报告(共23页)_第1页
中南大学计算机原理与汇编课设报告(共23页)_第2页
中南大学计算机原理与汇编课设报告(共23页)_第3页
中南大学计算机原理与汇编课设报告(共23页)_第4页
中南大学计算机原理与汇编课设报告(共23页)_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

1、计算机原理与汇编课程设计中南大学计算机原理(yunl)与汇编语言课程设计报告(bogo)题 目 汇编(hubin)语言课程设计 学生姓名 指导教师 王磊 学 院 信息科学与工程 专业班级 信息安全1302 完成时间 2015/7/12 目录 TOC o 1-3 h z u HYPERLINK l _Toc424488889 第一章:反向输出一个整数 PAGEREF _Toc424488889 h 3 HYPERLINK l _Toc424488890 一、需求分析 PAGEREF _Toc424488890 h 3 HYPERLINK l _Toc424488891 二、总体设计 PAGERE

2、F _Toc424488891 h 3 HYPERLINK l _Toc424488892 三、详细设计 PAGEREF _Toc424488892 h 3 HYPERLINK l _Toc424488893 四、调试分析 PAGEREF _Toc424488893 h 6 HYPERLINK l _Toc424488894 五、测试结果 PAGEREF _Toc424488894 h 7 HYPERLINK l _Toc424488895 六、总结 PAGEREF _Toc424488895 h 7 HYPERLINK l _Toc424488896 七、参考文献 PAGEREF _Toc4

3、24488896 h 7 HYPERLINK l _Toc424488897 八、附录 PAGEREF _Toc424488897 h 8 HYPERLINK l _Toc424488898 第二章:判断年份是否是闰年 PAGEREF _Toc424488898 h 10 HYPERLINK l _Toc424488899 一、需求分析 PAGEREF _Toc424488899 h 10 HYPERLINK l _Toc424488900 二、总体设计 PAGEREF _Toc424488900 h 10 HYPERLINK l _Toc424488901 三、详细设计 PAGEREF _T

4、oc424488901 h 10 HYPERLINK l _Toc424488902 四、调试分析 PAGEREF _Toc424488902 h 12 HYPERLINK l _Toc424488903 五、测试结果 PAGEREF _Toc424488903 h 12 HYPERLINK l _Toc424488904 六、总结 PAGEREF _Toc424488904 h 13 HYPERLINK l _Toc424488905 七、参考文献 PAGEREF _Toc424488905 h 13 HYPERLINK l _Toc424488906 八、附录 PAGEREF _Toc42

5、4488906 h 13 HYPERLINK l _Toc424488907 第三章:输出1000以内的素数 PAGEREF _Toc424488907 h 17 HYPERLINK l _Toc424488908 一、需求分析 PAGEREF _Toc424488908 h 17 HYPERLINK l _Toc424488909 二、总体设计 PAGEREF _Toc424488909 h 17 HYPERLINK l _Toc424488910 三、详细设计 PAGEREF _Toc424488910 h 17 HYPERLINK l _Toc424488911 四、调试分析 PAGER

6、EF _Toc424488911 h 19 HYPERLINK l _Toc424488912 五、测试结果 PAGEREF _Toc424488912 h 20 HYPERLINK l _Toc424488913 六、总结 PAGEREF _Toc424488913 h 20 HYPERLINK l _Toc424488914 七、参考文献 PAGEREF _Toc424488914 h 20 HYPERLINK l _Toc424488915 八、附录 PAGEREF _Toc424488915 h 21计算机原理与汇编课程设计反向输出一个整数第一章:反向输出一个(y )整数一、需求(xq

7、i)分析本实验(shyn)的功能是输入一个整数,反向输出,如输入12345 输出54321,但本实验限定输入整数最长的位数不超过10。如果想要实现10位以上整数的反向输出,则需要修改程序的数据段定义。二、总体设计 提示输入,输入整数位数,输入整数,定义用于输入的函数input和用于输出的循环函数output三、详细设计1、两个字符串用于输入的提示,先输入整数位数,再输入整数: string1 db please the number of digit(less than 10):,13,10,$ string2 db 13,10,please input the digit:,13,10,$

8、用int 21h 进行输出2、输入的位数用作输入整数时的循环次数3、定义用于输入的函数 数据段定义: digit dw ?,?,?,?,?,?,?,?,?,? 这样定义后最多存入10位mov cx,bx cx代表循环次数,可用户输入 lea si,digit ;si指向digit首地址input: mov ah,01h ;输入 int 21h mov si,al ;将输入的数存入数组 inc si ;si指向下一位 loop input 把输入(shr)的整数(zhngsh)存入digit中4、定义(dngy)用于反向输出的函数 output: mov dl,si mov ah,02h ;输出

9、 int 21h dec si ;si指向前一位 loop output5、整个程序顺序执行 流程图: 图1-1 整体流程图四、调试(dio sh)分析 在设计(shj)程序过程中,首先一个问题就是如何输入一个多位的整数,因为用mov ah,01h,int 21h语句(yj)输入时,只能输入以为数字。在这个程序里相当于定义了一个数组来存放每一位数字。用数组也能方便反向输出,但是最大的问题是寻址问题,实验过程中出现了很多问题,所用寻址方式不当导致程序不能运行或者运行错误。 本实验还可以进一步设计,实现当输入不当是提示出错等功能五、测试结果 图1-4 反向输出测试结果六、总结本实验总体来说比较简单

10、,只要输入时存入数组,就可以方便地反向输出,把一个整数分成每一位数字来实现。在这个过程中,我首先熟悉了循环体的使用,输入输出函数都是循环函数,用loop实现cx存储循环次数。一个重点就是如何寻址。因为要把一个整数的每一位存入数组,那么存数和取数就是重点。这个实验让我加深了认识,也更熟练。不断调试的过程中也可以熟练的用debug进行单步调试,观察各个寄存器的变化。总体来说,这个实验让我能够简单的熟悉汇编语言的编程过程,对他有了一些更加深刻的认识。也能够简单的看懂一些程序代码,对我学习汇编有很大的帮助。七、参考文献【1】汇编语言程序设计(chn x sh j)第二版 沈美明 温冬婵【2】程序设计(

11、chn x sh j)实验指导 蔡启先 王志文 黄晓璐八、附录(fl) 源代码:DATAS SEGMENT ;此处输入数据段代码 string1 db please the number of digit(less than 10):,13,10,$ string2 db 13,10,please input the digit:,13,10,$ digit dw ?,?,?,?,?,?,?,?,?,? hc db 13,10,output:,$DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,S

12、S:STACKSSTART: MOV AX,DATAS MOV DS,AX sub ax,ax lea dx,string1 ;输出字符串1 mov ah,09h int 21h mov ah,01h ;输入个数 int 21h sub al,30h ;转换ascii码 mov bl,al ;存入bx中 mov cx,bx ;循环(xnhun)次数 lea dx,string2 ;输出(shch)字符串2 mov ah,09h int 21h lea si,digit ;si指向(zh xin)digit首地址input: mov ah,01h int 21h mov si,al inc si

13、 loop input lea dx,hc ;提示结果输出 mov ah,09h int 21h mov cx,bx ;循环次数 dec si ;si指向最后一位output: mov dl,si ;取出数组值 mov ah,02h int 21h dec si ;si指向前一位 loop output MOV AH,4CH INT 21HCODES ENDS END START计算机原理与汇编课程设计闰年的判断第二章:判断(pndun)年份是否是闰年一、需求(xqi)分析本程序(chngx)用于在键盘输入年份,判断该年份是否是闰年,并输出结果。本程序年份均为四位。二、总体设计 提示输入年份,

14、将年份调用input函数以每一位数字存入year1数组中,change函数将数组中的数转换为16进制数存入year变量中。判断是否为闰年,并输出结果。三、详细设计1、定义输入函数,将年份的每一位存入数组year1中,循环4次,并将其ascii码转化 mov cx,4 lea si,year1input: ;输入年份,存入year mov ah,01h int 21h sub al,30h mov bl,al mov si,bl inc si loop input2、定义转换函数,将数组中的每一位数还原为一个数,并将此年份数存入year中,一下为change函数的部分代码,以此类推 change

15、: lea si,year1 mov bx,0fh mov ax,si and ax,bx mov dx,1000 mul dx add year,ax inc si 共有(n yu)四个类似(li s)的程序块,用于将每一位数合在一起(yq),还原原本年份值。3、判断该年份能否被400整除,若能,则输出yes,若不能则判断能否被4整除,judge1函数为判断能否被4整除,若能,则判断能否被100整除,转到judge2函数,若不能则输出no。 mov ax,year cwd mov cx,190h div cx cmp dx,0 jz output1 jnz judge1 jmp exit 流

16、程图: 图2 整体(zhngt)流程图四、调试(dio sh)分析 在完成这个程序(chngx)过程中,怎样将存入数组的每一位还原为年份值是一个重点,我没有使用循环体,而是直接写了四个程序块,将每一位的值相加。用循环体可以让程序更简洁。用debug中的P语句进行单步执行,观察每一次执行后各寄存器的变化,查找程序哪一步或者哪个值传的不正确,最终完成程序编写。五、测试结果 图2.1 判断闰年测试截图1 图2.2 判断(pndun)闰年(rnnin)测试(csh)结果2六、总结这个程序在写的过程中出现了很多错误,开始的时候我直接把存在数组中的每个数以移位的方式存储在了year中,调试后发现这样的结果

17、已经更改了原本输入的值,后来想用与循环实现change函数,但是由于对寻址方式还不是特别熟练因而没能用循环体,而是直接写了四个程序块,将其转化。虽然这个程序不难,但是由于我对汇编还不熟练,寄存器功能掌握不好,各种指令中隐含的寄存器的变化不是很清楚,所以花费了很多时间来调试,每一个函数功能的实现都是单独调试好函数后才放在一起组合成完整的程序。判断过程中,用除法如果不扩展的话就会出现溢出错误,通过这个程序我学会了如何用cwd扩展。在这个过程中,我由于有点地方思考方向错误因而浪费了很多时间,最后终于完成了程序,给了我信心,我也从中学到了很多。七、参考文献【1】汇编语言程序设计第二版 沈美明 温冬婵【

18、2】程序设计实验指导 蔡启先 王志文 黄晓璐八、附录DATAS SEGMENT ;此处输入数据段代码 year1 db ?,?,?,? string db please input year:,13,10,$ year dw 0 string1 db 13,10,yes,13,10,$ string2 db 13,10,no,13,10,$DATAS ENDSSTACKS SEGMENT ;此处输入堆栈(duzhn)段代码STACKS ENDSCODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKSSTART: MOV AX,DATAS MOV DS,A

19、X ;此处输入(shr)代码段代码 sub ax,ax lea dx,string mov ah,09h int 21h mov cx,4 lea si,year1input: ;输入年份(ninfn),存入year mov ah,01h int 21h sub al,30h mov bl,al mov si,bl inc si loop inputchange: ;转换函数,将存在数组中的每一位还原为原本的数值 lea si,year1 mov bx,0fh ;取后四位 mov ax,si and ax,bx mov dx,1000 ;将其每一位还原(hun yun)原本的十进制值 mul

20、dx add year,ax ;year存储单元最初(zuch)为1,存放每一位还原十进制后的和 inc si ;si指向下一个(y )单元 mov ax,si and ax,bx mov dx,100 mul dx add year,ax inc si mov ax,si and ax,bx mov dx,10 mul dx add year,ax inc si mov ax,si and ax,bx add year,ax;* mov ax,year ;判断函数 cwd ;转换为双字,若不扩展则除法溢出 mov cx,190h div cx cmp dx,0 jz output1 jnz

21、judge1 jmp exitjudge1: ;判断能否被4整除 mov cx,4h mov ax,year cwd div cx cmp dx,0 jz judge2 jnz output2judge2: ;判断(pndun)能否被100整除 mov cx,64h mov ax,year cwd div cx cmp dx,0 jz output2 jnz output1output1: ;输出(shch)yes lea dx,string1 mov ah,09h int 21h jmp exit output2: ;输出(shch)no lea dx,string2 mov ah,09h

22、int 21h jmp exit exit: MOV AH,4CH INT 21HCODES ENDS END START计算机原理与汇编课程设计素数输出第三章:输出(shch)1000以内的素数(s sh)一、需求(xqi)分析使用子程序计算出1000 以内的素数,并以十进制形式输出。二、总体设计 主函数用于初始化并调用子程序judge,子程序judge用于判断从3到1000的数是否为素数并输出三、详细设计1、主函数main初始化,digit用于存储需要判断的数,digit4用于判断过程中的除数,循环次数xunhuan为10002、判断函数judge 主要判断体,用于判断一个数是否可以被整除

23、,除数为小于该数的数 rotate: mov ax,digit cwd div digit4 ;从2开始除 cmp dx,0 ;是否能除尽 jnz judge1 ;不能整除 jz digit_add ret ;不是素数返回3、 判断体除数的循环函数,用于给digit4赋值,让他可以从2 开始取所有小于待检测数的值judge1: mov ax,digit dec ax cmp digit4,ax ;比较两个数 jns output ;相等(xingdng)时是素数 js jud_add ;除数(ch sh)小于要判定的数时,除数加1jud_add: inc digit4 jmp rotate4、

24、待检测(jin c)数的循环,用于将digit赋值取从3开始所有小于1000的整数来判定digit_add: mov ax,digit cmp ax,xunhuan ;判断检测的数是否到了1000 js d_add ;没有,则继续待检测的数加1后继续循环 jns exitd_add: add ax,1 mov digit,ax mov ax,digit3 ;digit3的作用是保持digit4可以还原为2 mov digit4,ax ;将digit4的值恢复成2,新的数从2开始检测 jmp rotate5、定义输出函数output,将数值以10进制形式输出。流程图:四、调试(dio sh)分析

25、(fnx)本程序(chngx)只有一个子程序,可以直接输出从给定数值(如本程序起始数值为3)开始所有小于1000的素数。也可以定义多个子程序,一个用于待检测数的循环,一个用于素数的判定,一个用于素数的输出。但由于我在实现的时候待检测数的循环没能用子程序实现,所以将这三个合并成了一个子程序,主函数只需调用一次子程序就能输出所有素数。由于检测值是从3开始的,所以输出没有2。五、测试(csh)结果 图3-3 输出(shch)1000内素数测试(csh)结果六、总结 通过这个程序,我学会了子程序的设计方法和如何调用子程序,在编写过程中,很多次由于调用不当和循环体设置不当的问题出现死循环,通过不断调试,

26、修改,运用debug中的p和t命令进行单步调试,终于弄清了循环体的函数跳转次序,在这个程序中,我也进一步熟悉了lea和mov的区别。 在子程序设计时,我首先编写的输出函数,测试成功后编写了判断的程序,由于判断程序过程中跳转很多,很多时候都有些混乱,在不断调试后才完成了判断过程的编写,最后加上循环体,总是会出现死循环,或者输出乱码,是由于跳转设置不当,还有比较值设置不当导致循环不断进行。 虽然中途出现了各种错误,但最终还是完成了这个程序,让我学会了很多,对汇编有了更深入的了解。七、参考文献【1】汇编语言程序设计第二版 沈美明 温冬婵【2】程序设计实验指导 蔡启先 王志文 黄晓璐八、附录(fl)源程序:DATAS SEGMENT ;此处输入(shr)数据段代码 digit dw ? d dw ? digit4 dw ? digit3 dw 2 xunhuan dw 1000 lop dw 1000,100,10,1DATAS ENDSSTACKS SEGMENT ;此处输入(shr)堆栈段代码STACKS ENDSCODES SEGMENTmain proc far ASSUME CS:CODES,DS:DATAS,SS:STACKSstart: MOV AX,DATAS MOV

温馨提示

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

评论

0/150

提交评论