计算机原理与汇编语言课程设计报告Word格式文档下载.docx
《计算机原理与汇编语言课程设计报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机原理与汇编语言课程设计报告Word格式文档下载.docx(27页珍藏版)》请在冰豆网上搜索。
变量以及数组需求:
需要一个变量count来计数,以便于素数的输出;
需要一个数组sushu来存放计算过程中得到的素数
寄存器需求:
在汇编里面,除法运算只能是16位除以8位或者32位除以16位,1000比255大,因此要用32位除以16,要用dx,ax来存放除数,bx存放被除数
程序开始
将求得素数以十进制输出
计算素数并储存
程序结束
求素数的算法
素数的约数只有1和本身
boolisPrime(intn)
{
if(n<
2)returnfalse;
for(inti=2;
i<
n;
++i)
if(n%i==0)returnfalse;
returntrue;
}
数据要以十进制输出,ASCII码要加上48
dispsushuprocnear
leasi,sushu
movcx,count;
控制输出
L5:
movbx,[si]
calldisp10
movdl,20h
movah,2
int21h
addsi,2
loopL5
ret
dispsushuendp
disp10procnear;
该子程序的作用是将BX中的数以十进制形式输出
pushcx
movcx,100d;
转化百位
movax,bx
movdx,0
divcx
movbx,dx
movdl,al
adddl,30h;
加48,变成字符型
movah,2
int21h
movcx,10d;
转化十位
adddl,30h
movdl,bl
转化个位
popcx
ret
disp10endp
编写过程中遇到了一些问题
这个错误系因为将count变量设为db型,而后面的数据存储时,用的是字节dw型
这个错误找了好久,后来发现是个位输出程序有误,忘记了将余数赋给dl
更正错误后,输出如下:
DATASSEGMENT
;
此处输入数据段代码
countdw0;
计数器
sushudw1000dup(?
);
存放素数
informationdb'
Thesushubetween1and1000are:
'
'
$'
;
显示素数的提示信息
DATASENDS
STACKSSEGMENT
此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
此处输入代码段代码
leadx,information;
显示提示信息
movah,9
int21h
movah,2
movdl,0dh
movdl,0ah
calljisuan
calldispsushu
MOVAH,4CH
INT21H
jisuanprocnear
leadi,sushu
movax,2
L1:
cmpax,1000
jaexit;
大于1000跳出子循环
movbx,2
L2:
cmpbx,ax
jaeL3;
小于ax的数都不能被ax整除,是素数
pushax
movdx,0
divbx
cmpdx,0;
判断是否能整除
popax
jzL4;
能整除,就ax加1,判断下一个数是否是素数
incbx;
不能整除就bx加1,继续判断
jmpL2
L3:
inccount
mov[di],ax;
保存ax
adddi,2;
存储单元指针指向下一个
L4:
incax
jmpL1
exit:
jisuanendp
movcx,count
CODESENDS
ENDSTART
二.实验二
Fibonacci数的定义如下:
FIB
(1)=1
FIB
(2)=1
FIB(N)=FIB(N-2)+FIB(N-1)N>
=3
变量及数组需求:
两个变量x1,x2,用于代替FIB(N-2),FIB(N-1),并初始化为1
一个数组FN,用来存储Fibonacci数
Ax>
50?
Ax=x1+x2
Yes
n
输出Fibonacci数
X1=x2
X2=AX
结束
算法描述:
functionfibonacci(n){
if(n==1|n==2){
return1;
else{
returnfibonacci(n-1)+fibonacci(n-2);
主要程序:
利用堆栈,实现x1,x2的互换,不断累加,求下一个Fibonacci数
PUSHX1
PUSHX2
S:
MOVAX,X1
ADDAX,X2
MOVFN[BX],AX;
ax中的数存在了数组FN[]中
PUSHX2;
上一个x2变成下一个x1
POPX1
MOVX2,AX;
上一个ax变成下一个x2
ADDBX,2
cmpAX,50
jlS
POPX2;
原始的x2=1
POPX1;
原始的x1=1
求出Fibonacci数后,以十进制数输出
DISP:
MOVAX,[SI]
MOVDX,0
MOVBX,10
DIVBX
PUSHDX
ADDAL,30H
MOVDL,AL
MOVAH,02H
INT21H
POPDX
ADDDL,30H
MOVAH,2
RET
错误原因:
没有将数字转化为字符输出
DATASEGMENT
X1DW1
X2DW1
FNDW25DUP(?
)
BUFDB0DH,0AH,'
Thefibonaccibelow50are:
DATAENDS
CODESEGMENT
ASSUMEDS:
DATA,CS:
CODE
MOVAX,DATA
MOVDS,AX
LEADX,BUF;
输出提示信息
MOVAH,9
MOVAH,02H
MOVDX,0DH
INT21H
MOVDX,0AH
MOVBX,0
LEASI,X1
MOVCX,BX;
通过BX来控制输出,即保证输出的数在50以内
S1:
CALLDISP;
显示一个其中的数
ADDSI,2
MOVAH,02H;
输出后面的DL中的内容(即空格)
MOVDL,20H;
显示三个空格
MOVDL,20H
subCX,1
LOOPS1;
循环(再一次读DIS