微机原理与接口技术实验报告(二)
一、实验目的
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
三、实验内容
(一)、算法思想
- 伪指令段定义斐波那契数列前两位0,1以及剩余的八位占位(在最后面加上终止符
$,以避免打印到屏幕时发生错误)。 MAIN段中对计数器CL赋初值2。CALC段进行计算,首先取F的地址,存入SI中。此时SI所存储地址是数列第一项的地址。- 令
SI与CL相加两次,目的是获得当前要求得项的地址,相加两次是因为数据定义为word型。 - 使用变址相对寻址的方式,找到当前数列项对应的前一项和前两项数列的地址并相加,存储到
AX寄存器中,再由AX寄存器存储到当前地址对应的当前数列项中。 - 计数器
CX自增。 - 比较
CX中的值与10是否不等,若不等,则跳转回CALC段,继续执行。直至等于10,顺序执行到PRINT段。 PRINT段调用DOS中断将F打印到屏幕上。- 结束,停机。
(二)、程序流程图
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的语句,避免在取地址操作的循环上损耗时间。