微机原理课程设计素材1.docx
《微机原理课程设计素材1.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计素材1.docx(34页珍藏版)》请在冰点文库上搜索。
![微机原理课程设计素材1.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/bd81381a-18b2-47f2-9e15-8199011eddef/bd81381a-18b2-47f2-9e15-8199011eddef1.gif)
微机原理课程设计素材1
微机原理上机实验报告
学习资料2007-01-2416:
40:
04阅读2062评论1字号:
大中小
★实验目的
1. 熟练掌握汇编语言程序设计的方法及上机步骤。
2. 掌握算术运算中,十进制数调整指令的应用。
3. 掌握子程序的设计方法。
4. 掌握DOS功能的调用方法。
★实验仪器
586微机1台
★实验内容及程序
1.编写求十进制数12678532与21736543之和的程序,并将和以十进制数的形式送屏幕显示。
编程要求与提示:
[1]两个加数均以压缩(组合)十进制数形式存放在ADD1和ADD2为首址的存贮器单元。
[2]和以压缩十进制数的形式存入SUM以下单元。
[3]将和送到屏幕显示部分功能的实现采用子程序的形式。
[4]实验步骤如下:
a.用全屏幕编辑软件建立源程序。
b.用masm.exe汇编程序对源程序进行汇编,形成目标程序。
c.用link.exe连接程序对目标程序进行连接形成可执行文件。
d.用DEBUG对连接通过的可执行程序进行调试。
流程图:
见图1
程序如下:
STACKSEGMENTSTACK'STACK'
DW100HDUP(?
)
STACKENDS
DATASEGMENT
ADD1DD12678532H;加数以组合十进制形式存放在双字单元
ADD2DD21736543H
SUMDD?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
LEASI,ADD1
LEADI,ADD2
LEABX,SUM
MOVAL,[SI]
ADDAL,[DI];最低位的一个字节相加
DAA;加法组合BCD码调整
MOV[BX],AL;结果存放在SUM第一个字节
MOVAL,[SI+1];第二个字节相加
ADCAL,[DI+1]
DAA
MOV[BX+1],AL
MOVAL,[SI+2]
ADCAL,[DI+2]
DAA
MOV[BX+2],AL
MOVAL,[SI+3]
ADCAL,[DI+3]
DAA
MOV[BX+3],AL
MOVDL,00;最高位字节有进位则显示"01"
ADCDL,00
CALLDISPSUM
MOVAH,4CH;返回DOS
INT21H
DISPSUMPROCNEAR;结果显示子程序
PUSHAX
PUSHBX
PUSHCX
PUSHSI
MOVSI,4
PUSHDX
MOVCX,5
LAB:
PUSHCX
PUSHBX
MOVAL,DL
MOVBL,DL
MOVCL,4;显示高位字节
SHRAL,CL
ADDAL,30H
MOVAH,02
MOVDL,AL
INT21H;显示一位字符
ANDBL,0FH;显示低位字节
ADDBL,30H
MOVAH,02
MOVDL,BL
INT21H
POPBX
POPCX
DECSI
MOVDL,[BX][SI];结果显示
LOOPLAB
POPDX
POPSI
POPCX
POPBX
POPAX
RET
DISPSUMENDP
CODEENDS
ENDSTART
2.有一个首地址为A的N字数组,请编程序使该数组中的数按从大到小的次序排列。
编程要求及提示:
[1]参加排序的数据及个数由学生自己定义。
[2]要将排序前的数组和排序后的数组在屏幕上显示出来。
[3]实验步骤同内容一。
流程图:
见图2.
程序如下:
STACKSEGMENTSTACK
DB256DUP(?
)
STACKENDS
DATASEGMENT
DATA1DW4031H,3859H,0245H,1111H,0A231H,0FFFFH
STRING1DB'Originalnumbers:
',0DH,0AH,'$'
STRING2DB'Thenumbersfromlargetosmall:
',0DH,0AH,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
LEADX,STRING1;显示人机交互提示
MOVAH,09H
INT21H
MOVCX,6
LEASI,DATA1;显示初始数据
L1:
MOVAX,[SI]
ADDSI,2
CALLDISPAX
CALLDISPCR
LOOPL1
MOVCX,5
LEASI,DATA1
ADDSI,10;指针指向最后一个数据
LP1:
PUSHCX
PUSHSI
LP2:
MOVAX,[SI];数据排序
CMPAX,[SI-2]
JBENOXCHG
XCHGAX,[SI-2];交换操作
MOV[SI],AX
NOXCHG:
DECSI;不需排序时继续
DECSI
LOOPLP2
POPSI
POPCX
LOOPLP1
LEADX,STRING2;显示字符串
MOVAH,09H
INT21H
MOVCX,6;显示排好序后数据
LEASI,DATA1
L2:
MOVAX,[SI]
ADDSI,2
CALLDISPAX
CALLDISPCR
LOOPL2
MOVAH,4CH
INT21H
DISPALPROC;显示AL内容子程序
PUSHAX
PUSHCX
PUSHDX
PUSHAX
MOVCL,4;处理高位十六进制数
SHRAL,CL
CALLCHANG
MOVAH,02H
MOVDL,AL
INT21H;显示一位字符
POPAX
ANDAX,0FH;处理低位十六进制数
CALLCHANG
MOVAH,02H
MOVDL,AL
INT21H
POPDX
POPCX
POPAX
RET
DISPALENDP
CHANGPROC;十六进制数转换为ASCII码
CMPAL,10
JNGECHANG1
ADDAL,7
CHANG1:
ADDAL,30H
RET
CHANGENDP
DISPAXPROC;显示AX内容子程序
XCHGAL,AH
CALLDISPAL
XCHGAH,AL
CALLDISPAL
RET
DISPAXENDP
DISPCRPROC;回车换行子程序
PUSHAX
PUSHDX
MOVAH,2
MOVDL,0AH
INT21H
MOVAH,2
MOVDL,0DH
INT21H
POPDX
POPAX
RET
DISPCRENDP
CODEENDS
ENDSTART
3.编写建立、写入、读出磁盘文件的程序要求:
(1)设计一个包括:
建立文件、写入文件、读出文件的主菜单。
(2)能用输入的文件名,在磁盘建立文件。
(3)向已有文件中写入数据。
(4)读出已有文件的内容(ascii码或16进制数)。
下面是我的一篇文件操作代码,你修一下就可以用了。
includekcsj.mac
.modelsmall
.386
.stack200h
publicprog1
.data
menudb30dup(''),'1.Displaytextfile',0ah,0dh
db30dup(''),'2.Copytextfile',0ah,0dh
db30dup(''),'3.Deletetextfile',0ah,0dh
db30dup(''),'4.Theend',0ah,0dh
db30dup(''),'Pleaseselectone(1~4):
','$'
prompt1db0ah,0dh,'Filename:
$'
prompt2db0ah,0dh,'Linesofpage(1~25):
$'
FNAMEdb15,?
15dup('');存放文件名的缓冲区
out1db0ah,0dh,'Cannotopenfile!
$'
out2db0ah,0dh,'Cannotreadfile!
$'
out3db0ah,0dh,'Cannotcreatfile!
$'
out4db0ah,0dh,'Cannotwritefile!
$'
out5db0ah,0dh,'Cannotdeletefile!
$'
out6db0ah,0dh,'Thefilehasbeencopyed!
$'
out7db0ah,0dh,'Thefilehasbeendeleted!
$'
bufferdb?
endcodedb0;错误标志
end1db0;结束标志
code1dw?
;原文件的代号
code2dw?
;新建文件的代号
signdb0
ask1db0ah,0dh,'Inputsourcefilename:
$'
ask2db0ah,0dh,'Inputdestfilename:
$'
rowdb23
infodb'PressESCtoquit,ptochangepage,anykeytocontinue!
$'
.code
prog1procfar
init
callmainshow
L1:
movah,1
int21h
cmpal,'1'
jedisplay
cmpal,'2'
jecopy
cmpal,'3'
jedelete
jmprtn1
display:
callfdisp
callmainshow
movend1,0
mov[row],23
movendcode,0
jmpL1
copy:
callfcopy
callmainshow
movendcode,0
movsign,0
jmpL1
delete:
callfdel
callmainshow
jmpL1
rtn1:
ret
prog1endp
mainshowprocnear
scroll0
cursor10,0
strdispmenu
ret
mainshowendp
fdispprocnear;分页显示
strdispprompt1
callfopen
scroll0;清屏
cursor0,0;置光标
cmpendcode,1
jnecont
movah,7
int21h
jmpext0
cont:
movbx,code1
callfread
cmpendcode,1
jeext1
callfshow;显示
cmpend1,1
jeext1
jmpcont
ext1:
movah,3eh;关闭文件
movbx,code1
int21h
ext0:
movendcode,0
ret
fdispendp
fopenprocnear;打开文件
callin_name
movah,3dh
moval,0
int21h
jncnext
movendcode,1
strdispout1
ret
next:
movbx,ax
movcode1,ax
ret
fopenendp
in_nameprocnear;输入文件名
leadx,FNAME
movah,0ah
int21h
leabx,FNAME+2
movah,0
moval,FNAME+1
addbx,ax
movbyteptr[bx],0
adddx,2
ret
in_nameendp
freadprocnear;读取文件
movah,3fh
movcx,1
leadx,buffer
int21h
jncpast
strdispout2
jmpexit
past:
cmpax,0
jeexit
ret
exit:
movah,3eh
int21h
movendcode,1
ret
freadendp
fshowprocnear;显示文件
movdl,[buffer]
movah,2
int21h
movah,3
movbh,0
int10h
cmpdh,[row]
jaed1
ret
d1:
strdispinfo
d2:
movah,7
int21h
cmpal,0
jzd2
cmpal,1bh;按ESC退出
jzd4;退出关闭文件endcode=1
cmpal,70h;按P提示输入每页行数
jnzd3
strdispprompt2
callchtonum
mov[row],al
d3:
scroll0
cursor0,0
ret
d4:
movend1,1
ret
fshowendp
chtonumprocnear
movbx,0
newchar:
movah,1;输入数字并转换为十进制
int21h
subal,30h
jlgoon
cmpal,9
jggoon
cbw
xchgax,bx
movcx,10d
mulcx
xchgax,bx
addbx,ax
jmpnewchar
goon:
moval,bl;行数传给AL
ret
chtonumendp
fcopyprocnear;文件拷贝
scroll0
cursor0,0
strdispask2
callfcreat
cmpendcode,1
jeover
movcode2,ax
strdispask1
callfopen
cmpendcode,1
jeetn0
again:
callfread
cmpendcode,1
jeetn0
movsign,1
pushbx
cmpax,0
jenext2
movcx,ax
movbx,code2
movah,40h
int21h
popbx
jncagain
strdispout4
ret
next2:
movah,3eh
movbx,code1
int21h
etn0:
movah,3eh
movbx,code2
int21h
cmpsign,1
jneover
strdispout6
over:
movah,7
int21h
ret
fcopyendp
fcreatprocnear;创建文件
callin_name
movah,3ch
movcx,00
int21h
jncnext1
movendcode,1
strdispout3
next1:
ret
fcreatendp
fdelprocnear;删除文件
scroll0
cursor0,0
strdispprompt1
callin_name
movah,41h
int21h
cmpax,0
jnzquit
strdispout5
movah,7
int21h
ret
quit:
strdispout7
movah,7
int21h
ret
fdelendp
endprog1
4.运行符合题目要求,按“q”键退出。
;按字母“S”画一个用不同颜色填充的三角形;
;按字母“Z”画一个用不同颜色填充且带有边框图案的矩形;
;
datasegment
info1db0dh,0ah,'pleasechoosetheletterS,Z,q:
'
db0dh,0ah,'(inputqtoquit)$'
x1dw140
y1dw60
x2dw500
y2dw400
colordw0c07h
dataends
stacksegmentstack
db200dup(0)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
mainprocfar
movax,data
movds,ax
movax,12h
int10h
input:
leadx,info1
movah,9
int21h
@in:
movah,0
int16h
cmpah,10h;按键码'q'和"Q"
jzexit
cmpah,1fh;'s'和"S"
jzsa
cmpah,2ch;'z'和"Z"
jnz@in
zhen:
callzheng
callfill
jmpexit
sa:
callsan
exit:
movah,1
int21h
movah,4ch
int21h
ret
mainendp
;画三角块
sanprocnear
moval,1
a0:
movdx,1
movbp,1
movcx,320
a1:
pushcx
pushbp
a2:
movah,12
pushax
int10h
popax
inccx
subbp,1
jnza2
popbp
addbp,2
popcx
incdx
cmpdx,20
jbeQ1
incal
Q1:
cmpdx,40
jbeQ2
incal
Q2:
deccx
jnea1
ret
sanendp
zhengprocnear
;******画矩形******
movcx,x1
movdx,y1
movsi,x2
movdi,y2
cmpcx,si
jbeQ3
xchgcx,si
movx1,cx
movx2,si
Q3:
cmpdx,di
jbeQ5
xchgdx,di
movy1,dx
movy2,di
Q5:
;画矩形边框
PUSHDX
PUSHCX
@31C:
MOVAX,color
INT10H
INCCX
CMPCX,SI
JNZ@31C
@326:
INT10H
INCDX
CMPDX,DI
JNZ@326
POPSI
@32E:
MOVAX,color
INT10H
DECCX
CMPCX,SI
JNZ@32E
POPDI
@339:
INT10H
DECDX
CMPDX,DI
JNZ@339
RET
fill:
movax,0c01h
movcolor,ax
incx1
incy1
decx2
decy2
movsi,x2
movbp,y2
movdi,bp
shrdi,1
movdx,y1
callCol
inccolor
adddi,100
callCol
movax,0c04h
movcolor,ax
adddi,100
callCol
ret
;填充色块
Col:
movcx,x1
_31C:
MOVAX,color
INT10H
INCCX
CMPCX,SI
JNZ_31C
incdx
cmpdx,di
jbeCol
ret
zhengendp
codeends
endmain
微机接口课程设计
实验报告
计算机31班
秦鹏程
03055014
实验一 电子琴
一、实验目的
1. 通过D/A转换器产生模拟信号,使PC机作为简易电子琴
2. 了解利用数模转换器产生音乐的基本方法
二、实验内容
实验电路如图所示,8253的CLK0接1MHz时钟,GATE0接+5V,OUT0接8255的PA0,J1接喇叭,编程使计算机的数字键1、2、3、4、5、6、7作为电子琴按键,按下即发出相应的音阶。
三、编程提示
1.对于一个特定的D/A转换接口电路,CPU执行一条输出指令将数据送入D/A,即可在其输出端得到一定的电压输出,给D/A转换器输入按正弦规律变化的数据,在其输出端即可产生正弦波,对于音乐,每个音阶都有确定的频率。
各个音阶标称频率值:
音阶 频率:
(单位Hz)