运算类程序设计

  • 格式:doc
  • 大小:108.50 KB
  • 文档页数:5

《计算机原理实验报告》
实验(一)名称:运算类程序设计
一、实验目的与要求:
1、掌握使用运算类指令编程及调试方法
2、掌握运算类指令对各状态标志位的影响及测试方法
3、画出程序流程图,给出程序清单,并加以适量注释
4、总结运算类程序设计的方法
二、编程算法与说明:
8086/8088指令系统中有乘除法指令,但是没有开平方指令。

因此,开平方运算时通过程序实现。

算法为减奇数法开平方。

我们知道,N个自然数中的奇数之和等于N2,即:
1+3=4=22;1+3+5=9=32;1+3+5+7=16=42;……
若要做√S运算,那么就可以从S中逐次减去自然数中的奇数1、3、5、7、……,一直进行到相减数为0或者不够减下一个自然数的奇数为止,然后统计减去自然数的奇数个数,它就是S的近似平方根。

三、程序流程图:
四、程序清单:;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;数据段定义
data segment
msg db '201081516 linyun',0dh,0ah,'$'
infor db 'please input a number(1-32768):',0dh,0ah,'$'
result db 'the result is:',0dh,0ah,'$'
data ends
;;;;;;;;;;;;;;;;;;;代码段定义
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,msg
mov ah,9h
int 21h
lea dx,infor
mov ah,9h
int 21h
mov dl,0 ;dl为计数器
mov bx,1 ;bx为奇数累加
mov si,0
circle:
mov ah,01h
int 21h
cmp al,0dh ;输入为回车键时则跳转,否则一直循环
je quit
mov di,10
and ax,00ffh
sub al,30h
add ax,si
mul di ;先将输入的数据乘以10
mov si,ax
loop circle
quit:
mov ax,si
div di ;由于一开始对数据先乘以了10,要还原为真实的数据,应该除以10 subt:
sub ax,bx
cmp ax,0 ;与0比较,若小于0,则说明已经减去了所包含的奇数
jl next
inc dl
add bx,2
jmp subt
next: ;将计数器dl的值保存在ax中
mov al,dl
and ax,00ffh
mov bp,sp ;先保存下栈顶指针的值
label01:
mov cl,10
div cl ;将ax除以10取余数
cmp al,0 ;若余数已经是0,说明已经全部除尽,也就是只有最后一个余数没有入栈了je label02
mov dx,ax ;保存一下ax中的余数和商
mov cl,8
shr ax,cl ;通过移位操作,取出AX中的余数ah
push ax ;余数入栈
mov al,dl
and ax,00ffh ;将商取出再赋给AX,再进行除10取余运算
jmp label01
label02:
mov cl,8 ;一开始调试的时候程序出问题就是因为少了这行代码,导致cl编程了10 shr ax,cl
push ax ;将最后一个余数进栈
lea dx,result
mov ah,09h
int 21h
label03:
pop ax ;ax出栈并调用中断的2号功能现在在控制台
mov dl,al
add dl,30h
mov ah,02h
int 21h
cmp bp,sp ;由于原先保存了栈顶指针,所以将现在的栈顶指针和原先的比较
jne label03 ;若不相等,说明还有余数在栈中,跳转,继续出栈
mov ah,4ch
int 21h
code ends
end start
五、实验结果与分析:
1.实验结果截图:
图一:编译通过
图二:分别输入二位数,三位数,四位数,五位数的结果,经验算,结果正确
2.实验分析:
本程序支持1-32768内的数的开平方,从运行结果来看,很好的实现了所要求的功能。

同时程序也提供了一个较好的人机交互。

六、实验体会
本实验要求编写一个开平方的程序,算法为减奇数法开平方,编程的时候,遇到了很多bug。

在编译期间,开始出现了22个错误,后来经过查错,发现原来是我在程序中用了label这个标识,“label”在汇编中属于保留字。

在编译通过后,发现程序还是实现不了功能,通过td.exe我将程序出错的地方慢慢定位到堆栈的进栈与出栈中,后来发现原来是寄存器赋值的问题。

我先将CL赋成了8,后来又赋值成了10,导致寄存器的值发生了改变,导致对AX进行8位移位操作的时候变成了10位移位操作,导致程序有问题。

通过细心调试,查看寄存器里的值的变化,终于较为成功的完成了实验。

学生签字:日期:。