微机原理与接口技术实验报告(二)

一、实验目的

1. 掌握MASM、emu8086工具调试汇编程序。 2. 编写计算斐波那契数列的程序。

二、实验要求

编写计算斐波那契数列前10个数的程序。斐波那契数列的定义如下: F(0) = 0; F(1) = 1; 当n>2时,F(n) = F(n-1) + F(n-2)

DATA SEGMENT
    F DW 0,1,8 DUP(?)
DATA ENDS

三、实验内容

(一)、算法思想

  1. 伪指令段定义斐波那契数列前两位0,1以及剩余的八位占位(在最后面加上终止符$,以避免打印到屏幕时发生错误)。
  2. MAIN段中对计数器CL赋初值2
  3. CALC段进行计算,首先取F的地址,存入SI中。此时SI所存储地址是数列第一项的地址。
  4. SICL相加两次,目的是获得当前要求得项的地址,相加两次是因为数据定义为word型。
  5. 使用变址相对寻址的方式,找到当前数列项对应的前一项和前两项数列的地址并相加,存储到AX寄存器中,再由AX寄存器存储到当前地址对应的当前数列项中。
  6. 计数器CX自增。
  7. 比较CX中的值与10是否不等,若不等,则跳转回CALC段,继续执行。直至等于10,顺序执行到PRINT段。
  8. PRINT段调用DOS中断将F打印到屏幕上。
  9. 结束,停机。

(二)、程序流程图

st=>start: 开始
op10=>operation: 初始化
op11=>operation: CX寄存器赋初值
op21=>operation: 取F的地址到SI
op22=>operation: SI+2×CX
op23=>operation: 取前一项、两项相加,保存结果
op24=>operation: 计数器自增
c1=>condition: CX是否不等于10
io=>inputoutput: DOS中断输出
e=>end

st->op10->op11->op21->op22->op23(right)->op24->c1(left)->io->e
c1(yes,left)->io
c1(no,right)->op21

(三)、汇编代码

DATA SEGMENT
    F DW 0,1,8 DUP(?),'$'
DATA ENDS
CODE SEGMENT
    ASSUME CS:CODE,DS:DATA
MAIN:
    MOV AX,DATA
    MOV DS,AX
    MOV CX,2             
CALC:
    LEA SI,F  
    ADD SI,CX
    ADD SI,CX
    MOV AX,[SI-4]
    ADD AX,[SI-2]
    MOV [SI],AX
    INC CX
    CMP CX,10
    JNZ CALC    
PRINT:
    XOR AX,AX
    MOV AH,9
    LEA DX,F
    INT 21H    
CODE ENDS
    END MAIN

四、实验记录

如图所示,emu8086软件模拟DOS中断输出的结果。

如图所示,emu8086软件模拟内存中的数值结果,符合斐波那契数列规律。

五、实验总结

通过使用EMU8086软件可以实现斐波那契数列的运算。在这里编写的汇编程序中还有一定的优化空间。比如第11行~13行指令可以放在MAIN段中,在17行再加入两遍INC SI或是ADD SI, 2的语句,避免在取地址操作的循环上损耗时间。

results matching ""

    No results matching ""