- 1、本文档共24页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
汇编语言斐波那锲数列
汇编语言实验报告
学院:
***
班级:
***
姓名:
***
学号:
***
指导老师:
**
目录
TOC\o1-3\h\z\u实验一斐波那契数列 5
1. 设计要求 5
2. 设计思想和实施方案论述 5
3. 课程设计中遇到的问题及解决方案 7
4. 程序流程图 8
5. 源程序及注释 8
实验二统计学生成绩 15
1. 设计要求 15
2. 设计思想和实施方案论述 15
3. 典型程序模块及典型编程技巧分析 15
4. 课程设计中遇到的问题及解决方法 17
5. 程序流程图,程序清单和程序注释 17
6. 程序清单和注释 19
收获与体会 24
参考书籍: 24
实验一斐波那契数列
设计要求
用递归的方法求斐波那契的第24项(N=24),并将结果用十进制显示出来
输出FIB(24)的值
设计思想和实施方案论述
FIB函数采用子程序递归调用方法,实现求斐波那契数列
先写出高级语言中的斐波那契递归函数:
Intfib(intN)
{
If(N==1||N==0)result=1;
Elseresult=fib(n-1)+fib(n-2);
Returnresult;
}
其函数为高级语言的形式,其中result=fib(n-1)+fib(n-2)隐含了几个操作可把它展开为:
N=N-1;注意到这里的N是形参(局部变量)与调用程序的实参不是同一个变量
Inta=fib(N)
N=N-1
Intb=fib(N)
Result=a+b;
由此可知几个重要实现地方:
保存现场:N在一个fib函数里面是局部变量,当系统调用子程序时需要保存这个局部变量,在返回时需要恢复:
SUBTPROCNEAR
PUSHAX
PUSHBX
…….
…….
POPBX
POPAX
SUBTENDP;采用保存恢复寄存器的形式
参数传递:其中的N在调用fib传参时是作为实参,在被调用函数中还需要被使用,这是参数的传递,这里采用通过数据区传递参数(同全局变量)
返回值:最后的result在高级语言中是通过将result赋给一个临时变量(调用该函数的程序)然后释放result这个局部变量,在本程序中采用寄存器直接传递的方法,所以在Fib函数中将result赋给一个寄存器,然后不保存它,让其传递到上层调用函数中去。
课程设计中遇到的问题及解决方案
遇到的问题
在编写斐波那契函数的过程中主要遇到了问题是保存现场的问题,在高级语言中,对子程序调用时,系统会自动为我们保存当前程序的现场指令地址,局部变量。而在汇编中除了现场指令地址保存外,其他的工作都必须我们自己完成,所以在对子程序调用时,怎么保存当前的局部变量,怎么传递参数到将要调用的函数中去使用,都是很难理顺思路的地方。
解决方案
第一:明确哪些是局部变量,在调用完子程序返回时要恢复的。
第二:局部变量作为实参,与被调用的子程序中的形参的区别。
第三:确保有压栈就必须对应出栈,且系统的中断指令地址的保存与我们使用的栈是同一个栈
解决方案在上面已经写过,就没有在复述了
程序流程图
………
……….
……….
N
N-1
N-2
……….
2
1
Fib(2)
Fib(1)
Fib(N-2)
Fib(N-1)
Fib(N)
源程序及注释
DATASSEGMENT
message1dbinputthenumber,$
NUM=18h ;修改此处获得第N项斐波那契数列值
Ndw0 ;用于传参的N
DATASENDS
CODESSEGMENT
ASSUMECS:CODES,DS:DATAS
Mainprocfar
START:
pushds
subax,ax
pushax
movax,DATAS
movds,ax
movbyteptrN,NUM
callFIB ;调用Fib子程序
movdx,ax
;callOutput_CTLF
callPrintOX ;将十进制转换为十六进制输出
movah,1
int21h ;等待退出屏幕
ret
Mainendp
;outputCTLF
Output_CTLFprocNear
pushax
pushdx
movah,02h
movdl,0dh
int21h
mov
文档评论(0)