创建博客 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

 
 
 

日志

 
 
关于我
文章分类
LOFTER精选

汇编语言实验报告——fibonacii数列  

2007-12-05 23:32:36|  分类: 默认分类 |  标签: |举报 |字号 订阅

一、    上机实验目的

本实验主要目的是使信息专业学生深入学习汇编语言知识,进一步提高学生汇编语言综合编程能力和程序调试技能,锻炼应用汇编语言编程解决实际问题的能力。锻炼提高学生的文档总结、论文撰写能力。

 

二、   上机实验内容:

    实验环境:Masm for Windows 集成实验环境 2008

本次上机实验的内容如下:

1在屏幕上开出三个窗口:

5,10

5,50

15,30

15,70

18,15

22,65

 

 

 

 


         键选择左窗口或右窗口为当前活动窗口,从键盘输入字符,字符就会从当前活动窗口的最下行开始显示,同时也在下窗口显示。当一行字符显示满后(左右窗口一行显示20个字符,下窗口显示50个字符),窗口自动向上卷动一行,输入的字符仍显示于最低一行,窗口最高一行向上卷动后消失,ESC键程序运行结束。

 

2、用递归的方法求斐波那契数的第24项(N=24),并将结果用十进制显示出来(要求:显示用宏实现)。

斐波那契函数FIB(N)的定义为:

 

程序输出FIB(24)的值。

 

3、统计学生成绩result

   设计10个学生的成绩分别为566984827388996310080分。试编制程序分别统计低于60分、60-69分、70-79分、80-89分、90-99分及100分的人数,并存放到S5S6S7S8S9S10单元中。

 

三、   基本要求:

1、学生在三个题目中任选两题,经确认后进行上机实验。

2、学生应认证查阅资料,独立完成设计任务。

3、学生应注重培养自己查阅资料的能力,独立思考、综合分析问题解决问题和调试程序的能力,以及文档总结、论文撰写能力。

4、按时完成上级设计,写出实验报告。

 

 

四、   实验分析

我选择了实验内容的第2个题目和第3个题目。

 

2个题目需要设置几个子程序:(1)输入数列项数子程序input,(2)fibonacii的值子程序fib.(3)输出子程序display.(能显示32位数)

(1)  输入数列项数子程序input,.调用1号中断处理从键盘输入一个数字,再减去30h,将字符的ascii码转换成二进制,再与数字9比较,保证输入的是数字而非其他字符,将输入的数字保存在bx寄存器中。若有两个及其以上的数字输入时,则将bx乘以10再加上刚输入的数字,便得到想要的十进制数且存在bx寄存器中。

(2)Fib子程序重点是递归的结束标志,及递归结束后,继续执行的语句。在数据段中设置字变量n,用于存放输入的项数,设置两个双字变量ft ,f用于返回求得的值,t用于保存中间结果,初值为0。在主程序中将bx的值赋给定义的字变量n

递归结束由所输入的项数n决定,当n 1时,给f赋值1同时程序返回,当n不为1时,n的值自减一次,再调用fib子程序自己,返回后将ft的值交换,再将tf相加,将结果存在f中,保证f的值是当前项的值,而t的值是前一项的值。在交换和相加的过程中,用dx:axbx:cx作中间桥梁来完成,相加过程中,低位与低位相加用指令add,高位与高位相加(带进位相加)用指令adc。然后再程序返回。

(3)display子程序比较难,因为要显示32的数,而所用的寄存器都是16的,所以要解决好无符号数的溢出。输出程序的基本思想是将所要输出的数变成一串字符。将所要输出数的每位数字取出来,将其压栈,再从栈中将一个一个的字符输出显示在屏幕上,这样便能够输出32位数了

输出子程序代码及分析:(主程序中有c语言接口,所以用了一些高级伪操作)

    ;子程序定义,近访问,使用ax,bx,cx,dx,si,di寄存器,source为参数

display proc near uses ax bx cx dx si di,source:dword

    mov bx,word ptr[source] ;souce的低位字送给bx

    mov cx,word ptr[source+2] ;source的高位字送给cx

    xor di,di                ;di0

    mov si,10                ;10送给si

    .repeat                  ;循环伪操作

      xor dx,dx              ;dx0准备除法运算

      mov ax,cx              ;source的高位送给ax,准备除法运算

      div si                 ;除法运算,ax保存商,dx保存余数

      mov cx,ax              ;保存高位的商,准备下一次除法

      mov ax,bx             

      div si                 ;dx:ax的双字数除以10,即取出source

                       ;10进制数的最低位

add dl,'0'           ;10进制数的二进制变成相应的ASCII

      push dx               ;将该ASCII值压栈

      inc di                ;记录source十进制数的位数

      mov bx,ax             ;将十进制数的高位送回给bx

      .until bx==0 && cx==0 ;循环判断伪操作

      mov cx,di         ;将十进制的位数送给cx,作为出栈时计数使用

      .repeat           ;出栈循环体

         pop dx  ;将栈中元素逐个出栈,即十进制的高位数字à个位数字

         mov ah,2 ;dos 2号功能调用,显示dl中的字符

         int 21h

         .untilcxz     ;循环判断伪操作

         mov dl,cr     ;输出回车

         mov ah,2

         int 21h

         mov dl,lf     ;输出换行

         mov ah,2

         int 21h

         ret           ;子程序返回  

display  endp          ;子程序定义结束

 

(4)主程序比较简单,通过ax将数据段放入ds中,再调用输入函数input,将bx的值赋给n,调用fib子程序,输出换行和回车,再调用display子程序输出结果,调用display程序时,因子程序有参数,所以要用invoke指令来调用。程序中用了一些简化的伪指令,.model small  .starup     .repeat……until  等。

 

3个题目很简单,只需在数据段定义一个字数组,将成绩依次赋值给数组,再定义s5s10六个字变量,全部赋值为0.将成绩数组的首地址赋给bx寄存器,设定标号,将bx的内容赋给ax寄存器,将ax分别与60708090100比较进行转移,若ax<60s5自增一次,若60<ax<70s6自增一次,若70<ax<80 s7自增一次,若 80<ax<90 s8自增一次,若 90<ax<100s9 自增一次,若ax=100s10自增一次,转移语句执行以后再将bx的值加2,然后再循环执行上面的步骤直到数组最后一个元素为止,最后s5s10中便保存了各自分数段的人数。

五、实验心得

     因为学汇编语言还不是很久,所以编写的时候遇到很多困难,特别是编写fibonacii数列的时候,刚开始只要求能显示24项的值,这比较简单,因为24的值刚好没有溢出,输出程序很好编写,很早就编写出来了,当老师检查的时候才知道原来老师的本意是要求我们能够处理溢出,显示25项的值,因为从来没有处理过溢出,所以一点都不懂,查找了很多资料,都没有完整的程序,只是有思路,后来想到了将数转换成字符串来输出的时候,有不知道要用到那些指令,又只好一个一个的查阅相关资料,还好最后还是写出来了(绝对是自己完成的),虽然没有检查,不过也挺开心的,至少是经过自己努力写出来的,通过实验,我知道了很多指令的用法及一些伪指令的使用,这个收获是很大的,不管在以后的编程中还是在考试中,它都能为我带来好的结果。

六、参考资料

           《汇编语言程序设计》

           IBM—PC汇编语言程序设计(2)

           IBM—PC汇编语言程序设计实验教程》

七、   实验代码及结果

2题代码

.model small,c

;------the data segment-------------------------

.data

  cr=13

  lf=10

  f     dd 0   

  t     dd 0

  n     dw ?

;------------------------------------------------ 

.code     ; the code segment

;----------the function of input-------------------

input     proc   near

          mov    bx,0

newchar:  

          mov    ah,1

          int    21h

          sub    al,30h    ;change the ascii to binary

          jl     exit1

          cmp    al,9d     ;check  the input number

          jg     exit1

          cbw

         

          xchg   ax,bx     ;change the binary to decimal

          mov    cx,10d

          mul    cx

          xchg   ax,bx

          add    bx,ax

          jmp    newchar

exit1:     ret

input     endp

;----------the function of fibonacii-------------

fib       proc    near          

          cmp     n,1         ;the conditon of call back   

          je      basis

          dec     n

          call    fib         ;call itself

;-----exchange f and t---------------         

          mov     cx,word ptr t

          mov     bx,word ptr t+2

         

          mov     ax,word ptr f

          mov     dx,word ptr f+2

         

          mov     word ptr t,ax

          mov     word ptr t+2,dx

    

          mov     ax,cx

          mov     dx,bx

;--------put the result into f---------     

          add     ax,word ptr t

          adc     dx,word ptr t+2

         

          mov     word ptr f,ax

          mov     word ptr f+2,dx

          jmp     basis1

 

basis:

          mov     ax,1

          mov     dx,0

          mov     word ptr f,ax

          mov     word ptr f+2,dx

          jmp     basis1

         

basis1:

          ret

fib       endp

;---the function of output--------------------------------  

display proc near uses ax bx cx dx si di,source:dword

    mov bx,word ptr[source]

    mov cx,word ptr[source+2]

    xor di,di

    mov si,10

    .repeat

      xor dx,dx

      mov ax,cx

      div si

      mov cx,ax

      mov ax,bx

      div si

      add dl,'0'

      push dx

      inc di

      mov bx,ax

      .until bx==0 && cx==0

      mov cx,di

      .repeat

         pop dx

         mov ah,2

         int 21h

         .untilcxz

         mov dl,cr

         mov ah,2

         int 21h

         mov dl,lf

         mov ah,2

         int 21h

         ret

display  endp

;----------------------------------------

 .startup            ;tne main function

 push ds

 xor ax,ax

 mov ax,@data

 mov ds,ax

 call input         ;call the function input

 mov  n,bx

 call fib           ;call the function fibonacii

 mov dl,0ah         ;output the LF

 mov ah,2

 int 21h

 mov dl,0dh         ;output the CR

 int 21h

 invoke display,f   ;call the function ouput

 .exit 0

 end

 

2题结果:

 

3题实验代码:

datarea   segment

  grade   dw         56,69,84,82,73,88,99,63,100,80

    s5    dw         0  

    s6    dw         0

    s7    dw         0

    s8    dw         0

    s9    dw         0

   s10    dw         0

datarea     ends

;------------------------------------------------------

program    segment

 

 

main    proc    far

        assume  cs:program,ds:datarea

start:

      push     ds

      xor      ax,ax

      push     ax

 

      mov      s5,0

      mov      s6,0

      mov      s7,0

      mov      s8,0

      mov      s9,0

      mov      s10,0

      mov      cx,10

      mov      bx,offset grade

 

compare:

      mov      ax,[bx]

      cmp      ax,60

      jl       five

      cmp      ax,70

      jl       six

      cmp      ax,80

      jl       seven

      cmp      ax,90

      jl       eight

      cmp      ax,100

      jne      nine

      inc      s10

      jmp      short change_addr

 

nine:  inc      s9

       jmp      short change_addr

eight: inc      s8

       jmp      short change_addr

seven: inc      s7

       jmp      short change_addr

six:   inc      s6

       jmp      short change_addr

five:  inc      s5

 

change_addr:

       add      bx,2

       loop     compare

       ret

 

main   endp

;------------------------------------------

program  ends

         end    start

  评论这张
 
阅读(827)| 评论(0)
推荐 转载

历史上的今天

最近读者

热度

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014