微型计算机原理与接口技术课程设计.docx
《微型计算机原理与接口技术课程设计.docx》由会员分享,可在线阅读,更多相关《微型计算机原理与接口技术课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
微型计算机原理与接口技术课程设计
《计算机原理课程设计》实验报告
一、程序设计
题目一三十二位无符号乘法
1设计分析:
(1)程序设计任务:
用十六位乘法指令完成三十二位无符号数乘法(结果64位)。
使用MUL指令,完成双字无符号数乘法程序,要求乘数和被
乘数从键盘输入,结果显示于屏幕上。
(2)程序设计要求:
1)从键盘输入两个乘数(十进制或十六进制)
2)结果显示于屏幕上(十六进制)
(3)程序设计过程:
1)定义数据段用于开辟缓冲区存储输入数据、输出数据和乘积。
2)从键盘输入两个八位数字符(三十二字节)存入缓冲区
3)对缓冲区输入的字符进行处理,让Ascal码转换为数值本身的数值。
4)把三十二位分割成两位十六位,分别对其进行十六位的乘法。
5)将四个十六位乘法的乘积按照各自的位相加的最终乘积
6)对所得结果进行处理,让Ascal码转换为数值本身的数值
7)将结果向屏幕输出。
2、算法(一个框代表16位2进制数)
3、程序流程图:
4、测试数据:
被乘数
乘数
乘积
12345678
56780987
06261E4248E3D148
abcdabcd
abcdabcd
734C68C0779D8229
0000abcd
00000002
000000000001579A
65412398
a4f75b2c
413F90B646812620
abcd.1234
1234.abcd
0C37.C43A.E8F0.4FA4
5、运行结果:
(1)Inputthefirstnumber:
(8)12345678(回车)
Inputthesecondnumber:
(8)56780987(回车)
Theresultis:
06261E4248E3D148
(2)Inputthefirstnumber:
(8)abcdabcd(回车)
Inputthesecondnumber:
(8)abcdabcd(回车)
Theresultis:
734C68C0779D8229
(3)Inputthefirstnumber:
(8)0000abcd(回车)
Inputthesecondnumber:
(8)00000002(回车)
Theresultis:
000000000001579A
(4)Inputthefirstnumber:
(8)65412398(回车)
Inputthesecondnumber:
(8)a4f75b2c(回车)
Theresultis:
413F90B646812620
(5)Inputthefirstnumber:
(8)abcd1234(回车)
Inputthesecondnumber:
(8)1234abcd(回车)
Theresultis:
0C37C43AE8F04FA4
6、程序源代码及注解:
datasegment;数据段
buffdb10
db?
db10dup(0)
p1db'Inputthefirstnumber:
(8)','$'
p2db'Inputthesecondnumber:
(8)','$'
p3db'Theresultis:
','$'
crdb0dh,0ah,'$'
d1dw2dup(?
)
d2dw2dup(?
)
d3dw4dup(?
)
dataends
sstacksegmentstack'stack'
dw100hdup(?
)
sstackends
codesegment
mainprocfar
assumecs:
code,ds:
data,ss:
sstack
start:
pushds;为程序结束作准备
xorax,ax
pushax
movax,data;ds指向数据段
movds,ax
movax,sstack;ss指向堆栈段
movss,ax
movah,09;提示输入乘数
leadx,p1
int21h
callinp;输入乘数
leabx,d1
mov[bx],dx
mov[bx+2],ax
movah,09;回车换行
leadx,cr
int21h
movah,09;提示输入被乘数
leadx,p2
int21h
callinp;输入被乘数
leabx,d2
mov[bx],dx
mov[bx+2],ax
movah,09;回车换行
leadx,cr
int21h
movbx,offsetd1;1十六位乘法低低
movax,[bx]
movbx,offsetd2
movcx,[bx]
mulcx
pushdx
pushax
movbx,offsetd1;2高低
movax,[bx+2]
movbx,offsetd2
movcx,[bx]
mulcx
pushdx
pushax
movbx,offsetd1;3低高
movax,[bx]
movbx,offsetd2
movcx,[bx+2]
mulcx
pushdx
pushax
movbx,offsetd1;4高高
movax,[bx+2]
movbx,offsetd2
movcx,[bx+2]
mulcx
pushdx
pushax
movbx,offsetd3
popax;4乘积相加
popdx
mov[bx+6],dx
mov[bx+4],ax
popax;3
popdx
add[bx+4],dx
jnca
add[bx+6],wordptr1
a:
mov[bx+2],ax
popax;2
popdx
add[bx+4],dx
jncb
add[bx+6],wordptr1
b:
add[bx+2],ax
jncc
add[bx+4],wordptr1
jncc
add[bx+6],wordptr1
c:
popax;1
popdx
add[bx+2],dx
jncd
add[bx+4],wordptr1
jncd
add[bx+6],wordptr1
d:
mov[bx],ax
movdx,[bx+2]
movax,[bx]
leadx,p3;提示输出结果
movah,09
int21h
movbx,offsetd3;4从最高位开始向屏幕输出乘积
addbx,6
movdx,[bx]
calldispal
movbx,offsetd3;3
addbx,4
movdx,[bx]
calldispal
movbx,offsetd3;2
addbx,2
movdx,[bx]
calldispal
movbx,offsetd3;1
movdx,[bx]
calldispal
ret
mainendp
dispalproc;子程序,屏幕输出过程
pushcx
movch,4
movcl,4
movbx,dx
ll:
rolbx,cl
movdl,bl
anddl,0fh
lnz:
cmpdl,0ah
jblk
adddl,07h
lk:
adddl,30h
movah,2
int21h
decch
jnzll
popcx
ret
dispalendp
inpproc
movdx,offsetbuff;输入乘数子程序
movah,0ah
int21h
movbx,dx
movax,0
movcl,04h
movdh,4
lz:
shlax,cl;对乘数进行处理
movch,[bx+2]
cmpch,040h
jbe
subch,057h
jmpf
e:
andch,0fh
f:
addal,ch
addbx,1
decdh
cmpdh,0
jnelz
pushax
movdx,offsetbuff
movdx,4
movbx,dx
movax,0
movcl,04h
movdh,4
ls:
shlax,cl
movch,[bx+2]
cmpch,040h
jbee
subch,057h
jmpff
ee:
andch,0fh
ff:
addal,ch
addbx,1
decdh
cmpdh,0
jnels
movdx,ax;返回低位
popax;返回高位
ret
inpendp
codeends
endstart
题目二递归调用子程序设计
1、设计分析
(1)程序设计任务:
有n个人坐在一起,第n个人比第n-1个人大h岁。
第n-1个人比第n-2个人大h岁。
以此类推,第2个人比第1个人大h岁。
第1个人m岁。
请问第n个人多大。
用递归调用的方法设计程序完成题目。
(2)设计要求:
1)从键盘输入人数、第一个人的年龄和年龄差距
2)结果显示于屏幕上
(3)设计过程:
1)定义数据段用于存储输出提示字符。
2)从键盘输入人数n存进寄存器bl,第一个人的年龄m存进寄存器cl,年龄出差距h存进寄存器ch。
3)递归调用age,算出第n个人的年龄,并把结果存在寄存器bx里。
4)将结果(第n个人的年龄)向屏幕输出。
2、算法:
age(n)=age(n-1)+h
age(n-1)=age(n-2)+h
age(n-2)=age(n-3)+h
…
age
(2)=age
(1)+h
age
(1)=m
通用公式:
age(n)=age(n-1)+h当n>1时
age
(1)=m当n=1时
3、程序流程图:
4、测试数据:
人数n(1--9)
第一个人的年龄m(1--9)
年龄差距h
第n个人的年龄
1
1
1
01
4
8
6
1A
7
7
4
1F
3
9
0
09
5、运行结果:
(1)Inputthepersonstotalnumber:
(1-9)1(回车)
Inputthefirstpeoplesage:
(1--9)1(回车)
Inputtheagedchaju(1_9)1(回车)
Thelastpeoplesageis:
(1--99)01
(2)Inputthepersonstotalnumber:
(1-9)4(回车)
Inputthefirstpeoplesage:
(1--9)8(回车)
Inputtheagedchaju(1_9)6(回车)
Thelastpeoplesageis:
(1--99)1A
(3)Inputthepersonstotalnumber:
(1-9)7(回车)
Inputthefirstpeoplesage:
(1--9)7(回车)
Inputtheagedchaju(1_9)4(回车)
Thelastpeoplesageis:
(1--99)1F
(4)Inputthepersonstotalnumber:
(1-9)3(回车)
Inputthefirstpeoplesage:
(1--9)9(回车)
Inputtheagedchaju(1_9)0(回车)
Thelastpeoplesageis:
(1--99)09
6、程序源代码及注解:
datasegment
p1db'Inputthepersonstotalnumber:
(1-9)','$'
p2db'Inputthefirstpeoplesage:
(1--9)','$'
p3db'Inputtheagedchaju:
(1_9)','$'
p4db'Thelastpeoplesageis:
(1--99)','$'
crdb0dh,0ah,'$'
dataends
sstacksegmentstack'stack'
sadw50hdup(?
)
sstackends
codesegment
assumecs:
code,ds:
data,ss:
sstack
start:
movax,data
movds,ax
movax,sstack
movss,ax
movah,09;提示输入人数
leadx,p1
int21h
movah,1;输入人数
int21h
andal,0fh
movbl,al
leadx,cr;回车换行
movah,09;提示输入第一个人的年龄
int21h
leadx,p2
movah,09
int21h
movah,1;输入第一个人的年龄
int21h
movcl,al
andcl,0fh;第一个人的年龄
leadx,cr;回车换行
movah,09;提示输入年龄差距
int21h
leadx,p3
movah,09
int21h
movah,1;输入年龄差距
int21h
movch,al
andch,0fh
leadx,cr;回车换行
movah,09;提示输出结果
int21h
movdx,0
movbh,bl
callage;递归调用
movbl,dl;最后一个人的年龄
calloutp;输出结果
ret
递归调用子程序:
age(n)
入口参数:
人数n、年龄m
递归结束条件:
age
(1)=m。
ageproc;递归过程
cmpbh,1
jneone
movdl,cl
ret
one:
decbh
callage
adddl,ch
ret
ageendp
outpproc;屏幕输出过程
pushax
pushcx
movch,2
movcl,4
leadx,p4
movah,09
int21h
ll:
rorbl,cl
movdl,bl
anddl,0fh
lnz:
cmpdl,0ah
jblk
adddl,07h
lk:
adddl,30h
movah,2;输出一位
int21h
decch
jnell
pushax
pushcx
movah,4ch
int21h
outpendp
codeends
endstart
二、参考文献:
(1)周荷琴、吴秀清.《微型计算机原理与接口技术》(第四版).合
肥:
中国科学技术大学出版社,2008。
(2)聂聪.《计算机原理(微机原理)上机指导书》.大连:
大连工业大学,2008。
三、设计体会:
这次课程设计使我学会了编写汇编语言程序,其中遇到了很多的困难。
只有在解决问题的过程中我们才能体会到编程的辛苦与乐趣。
只有了解了汇编语言的基础知识才能很快熟练编写汇编语言程序。
经过这次课程设计收获很多,学会了一种新的编程语言,对编程有了更深的了解和理解,平时没注意的细节和没有掌握的基础知识得到了巩固与加强。