微机原理实验指导书.docx
《微机原理实验指导书.docx》由会员分享,可在线阅读,更多相关《微机原理实验指导书.docx(51页珍藏版)》请在冰点文库上搜索。
微机原理实验指导书
昆明理工大学
微机原理及程序设计
实验指导书
昆明理工大学信息工程与自动化学院
自动化系
2012年9月
实验一两个多位十进制数相加的实验
一、实验目的
1、学习数据传送和算术运算指令的用法。
2、熟悉在PC机上建立、汇编、链接、调试和运行8088汇编语言程序的过程。
二、实验内容
将两个多位十进制数相加。
要求被加数均以ASCII码形式各自顺序存放在以DATA1和DATA2为首的5个内存单元中(低位在前),结果送回DATA1处。
三、程序框图
显示被加数和加数
被加数和加数以ASCII码表示的数字串形
式转化为由十六进制表示的数字串形式
计数值5→CX
清除最低位进位
执行ADC带进位相加
AAA调整
结果送被加数区
调整偏移量
N
CX-1=0?
Y
十六进制的结果转化为ASCII码表示的数字串
显示结果
结束
四、程序清单
CRLFMACRO
MOVDL,0DH
MOVAH,02H
INT21H
MOVDL,0AH
MOVAH,02H
INT21H
ENDM
DATASEGMENT
DATA1DB33H,39H,31H,37H,34H
DATA2DB36H,35H,30H,38H,32H
DATAENDS
STACKSEGMENT
STADB20DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVSI,OFFSETDATA2
MOVBX,05
CALLDISPL
CRLF
MOVSI,OFFSETDATA1
MOVBX,05
CALLDISPL
CRLF
MOVDI,OFFSETDATA2
CALLADDA
MOVSI,OFFSETDATA1
MOVBX,05
CALLDISPL
CRLF
MOVAX,4C00H
INT21H
DISPLPROCNEAR
DS1:
MOVAH,02
MOVDL,[SI+BX-1]
INT21H
DECBX
JNZDS1
RET
DISPLENDP
ADDAPROCNEAR
MOVDX,SI
MOVBP,DI
MOVBX,05
AD1:
SUBBYTEPTR[SI+BX-1],30H
SUBBYTEPTR[DI+BX-1],30H
DECBX
JNZAD1
MOVSI,DX
MOVDI,BP
MOVCX,05
CLC
AD2:
MOVAL,[SI]
MOVBL,[DI]
ADCAL,BL
AAA
MOV[SI],AL
INCSI
INCDI
LOOPAD2
MOVSI,DX
MOVDI,BP
MOVBX,05
AD3:
ADDBYTEPTR[SI+BX-1],30H
ADDBYTEPTR[DI+BX-1],30H
DECBX
JNZAD3
RET
ADDAENDP
CODEENDS
ENDSTART
五、实验要求
1.读懂源程序,写出源程序注释。
2.把源程序修改为任意两个六位十进制相加。
并思考如果最高位有进位怎么办?
实验二两个数相乘的实验
一、实验目的
掌握乘法指令和循环指令的用法。
二、实验内容
实现十进制数的乘法。
被乘数和乘数均以ASCII码形式存放在内存中,乘积在屏幕上显示出来。
三、程序框图
乘数→BL
BL中数由ASCII码转化为十六进制
SI指向被乘数
计数值5→CX
取被乘数[SI]单元与BL相乘
AAM调整
结果低位与前次计算的进位[DI]相加
AAA调整
结果→[DI]
DI+1指向下一单元
本次计算的进位→[DI]
N
CX-1=0?
Y
显示结果
结束
四、程序清单
DATASEGMENT
DATA1DB32H,39H,30H,35H,34H
DATA2DB33H
RESULTDB6DUP(00H)
DATAENDS
STACKSEGMENT
STADB20DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVSI,OFFSETDATA2
MOVBL,[SI]
ANDBL,00001111B
MOVSI,OFFSETDATA1
MOVDI,OFFESTRESULT
MOVCX,05
LOOP1:
MOVAL,[SI]
ANDAL,00001111B
INCSI
MULBL
AAM
ADDAL,[DI]
AAA
MOV[DI],AL
INCDI
MOV[DI],AH
LOOPLOOP1
MOVCX,06
MOVSI,OFFSETRESULT
DISPL:
MOVAH,02
MOVDL,[SI+5]
ADDDL,30H
INT21H
DECSI
LOOPDISPL
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
五、实验要求
1.读懂程序,写出程序注释。
2.修改程序,实现6位数乘2位数的功能。
实验三BCD码相乘的实验
一、实验目的
掌握用组合的BCD码表示数据,并熟悉怎样实现组合BCD码乘法运算。
二、实验内容
实现BCD码的乘法,要求被乘数和乘数均以组合的BCD码形式存放,各占一个内存单元,乘积存放在另外两个内存单元中。
由于没有组合BCD码乘法指令,所以程序中采用将乘数1作为计数器,累加另一个乘数的方法得到计算结果。
三、程序框图
显示乘数1和乘数2
乘数1→计数器BL中
部分积DX清0
Y
BL=0?
N
进位位清0
显示结果
乘数2与部分积低位相加
结束
DAA调整
结果→DL
部分积高位进行进位位调整
DAA调整
结果→DH
计数器BL的值减1
DAS调整,并将结果送BL
四、程序清单
DISPLMACRO
ADDDL,30H
MOVAH,02
INT21H
ENDM
CRLFMACRO
MOVDL,0DH
MOVAH,02
INT21H
MOVDL,0AH
MOVAH,02
INT21H
ENDM
DATASEGMENT
DATA1DB01001000B
DATA2DB01110101B
RESULTDW?
DATAENDS
STACKSEGMENTSTACK
STADB20DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVAX,TOP
MOVSP,AX
MOVDI,OFFSETRESULT
MOVSI,OFFSETDATA1
MOVAH,[SI]
MOVCL,04
SHRAH,CL
MOVDL,AH
DISPL
MOVAL,[SI]
MOVBL,AL
ANDAL,00001111B
MOVDL,AL
DISPL
CRLF
MOVSI,OFFSETDATA2
MOVAH,[SI]
MOVCL,04
SHRAH,CL
MOVDL,AH
DISPL
MOVAL,[SI]
ANDAL,00001111B
MOVDL,AL
DISPL
CRLF
XORDX,DX
S1:
CMPBL,0
JZS2
CLC
MOVAL,[SI]
ADCAL,DL
DAA
MOVDL,AL
MOVAL,00H
ADCAL,DH
DAA
MOVDH,AL
MOVAL,BL
DECAL
DAS
MOVBL,AL
JMPS1
S2:
MOV[RESULT],DX
MOVSI,DX
MOVCL,4
SHRDH,CL
MOVDL,DH
DISPL
MOVDX,SI
ANDDH,00001111B
MOVDL,DH
DISPL
MOVDX,SI
MOVCL,4
SHRDL,CL
DISPL
MOVDX,SI
ANDDL,00001111B
DISPL
CRLF
S3:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
五、实验要求
1.读懂源程序,写出程序注释。
2.修改程序使其不显示被乘数和乘数。
实验四字符匹配程序
一、实验目的
掌握提示信息的使用方法及键盘输入信息的用法。
二、实验内容
编写程序,实现两个字符串比较。
如果两个字符串中有一个字符相同,显示“MATCH”,否则,显示“NOMATCH”。
三、程序框图
段寄存器及堆栈初始化
显示“请输入字符串1”
使用INT21H的0A号子功能,
接收键入的字符串
显示“请输入字符串2”
指针SI指向串1的首字符
SI指向的字符串和串2中所有字符作比较
Y
相等?
N
SI+1,指向串1中下一字符
N
串1中的字符已取完?
Y
显示“NOMATCH”显示“MATCH”
返回DOS
四、程序清单
CRLFMACRO
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
MESS1DB'MATCH',0DH,0AH,'$'
MESS2DB'NOMATCH',0DH,0AH,'$'
MESS3DB'INPUTSTRING1:
',0DH,0AH,'$'
MESS4DB'INPUTSTRING2:
',0DH,0AH,'$'
MAXLEN1DB81
ACTLEN1DB?
STRING1DB81DUP(?
)
MAXLEN2DB81
ACTLEN2DB?
STRING2DB81DUP(?
)
DATAENDS
STACKSEGMENTSTACK
STADB50DUP(?
)
TOPEQULENGTHSTA
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
MOVSP,TOP
MOVAH,09H
MOVDX,OFFSETMESS3
INT21H
MOVAH,0AH
MOVDX,OFFSETMAXLEN1
INT21H
CRLF
MOVAH,09H
MOVDX,OFFSETMESS4
INT21H
MOVAH,0AH
MOVDX,OFFSETMAXLEN2
INT21H
CRLF
CLD
MOVSI,OFFSETSTRING1
MOVCL,[SI-1]
MOVCH,00H
KKK:
MOVDI,OFFSETSTRING2
PUSHCX
MOVCL,[DI-1]
MOVCH,00H
MOVAL,[SI]
MOVDX,DI
REPNZSCASB
JZGGG
INCSI
POPCX
LOOPKKK
MOVAH,09H
MOVDX,OFFSETMESS2
INT21H
JMPPPP
GGG:
MOVAH,09H
MOVDX,OFFSETMESS1
INT21H
PPP:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
五、实验要求
1.读懂源程序,写出程序注释。
2.修改源程序,使其实现,当两个字符串中所有字符都匹配(注意字符串的长度和顺序)时才显示“MATCH”,否则显示“NOMATCH”。
实验五排序实验
一、实验目的
掌握用汇编语言编写排序程序的思路和方法。
二、实验内容
从首地址为1000H开始存放50个数,要求设计程序将这些数由小到大排序,排序后的数,仍放在该区域中。
三、程序框图
入口
段寄存器和堆栈初始化
显示“请输入段址”
调GETNUM,键入段址送ES
显示“请输入偏移量”
调GETNUM,键入偏移量SI
DS也指向附加段
外循环次数SORTNUM-1送CX
偏移指针BX清0
A
从[SI+BX]单元取数AL
交换单元指针AH=BL
CX入栈
计算内循环次数送CX
内循环控制变量DX初始化
DX值+1
比较AL与DX指示单元的值
N
AL较大?
Y
DX指示单元的值赋给AL,并修改指针AH
N
CX-1=0?
Y
交换[SI+BX]单元和AH指针指示的单元的值
偏移指针BX+1
CX出栈
N
ACX-1=0?
Y
显示“SORTOK!
”
循环调DISP1,将排序后的数依次显示出来
返回DOS
四、程序清单
CRLFMACRO
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
ORG160H
DATA1DB0ah,09h,08h,07h,06h,05h,04h,03h,02h,01h
SORTNUMEQU10
MESS1DB'INPUTSEGMENTVALUE:
$'
MESS2DB'INPUTOFFSETVALUE:
$'
MESS3DB'SORTOK!
',0DH,0AH,'$'
ERRORDB'INPUTERROR!
',0DH,0AH,'$'
DATAENDS
STACKSEGMENT
STADW32DUP(?
)
TOPDW?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVSP,TOP
MOVAH,09H
MOVDX,OFFSETMESS1
INT21H
CALLGETNUM
MOVES,DX
CRLF
MOVAH,09H
MOVDX,OFFSETMESS2
INT21H
CALLGETNUM
MOVSI,DX
PUSHES
POPDS;DS=ES
MOVCX,SORTNUM
DECCX
XORBX,BX
III:
MOVAL,[SI+BX]
MOVAH,BL
PUSHCX
MOVCX,SORTNUM
SUBCX,BX
DECCX
MOVDX,BX
JJJ:
INCDX
PUSHBX
MOVBX,DX
CMPAL,[SI+BX]
JBEUUU
MOVAL,[SI+BX]
MOVAH,DL
UUU:
POPBX
LOOPJJJ
MOVCL,[SI+BX]
MOV[SI+BX],AL
MOVDL,AH
PUSHBX
MOVBX,DX
MOV[SI+BX],CL
POPBX
INCBX
POPCX
LOOPIII
PUSHDS
MOVAX,DATA
MOVDS,AX
MOVAH,09H
MOVDX,OFFSETMESS3
INT21H
POPDS
MOVCX,SORTNUM
VVV:
MOVAL,[SI]
CALLDISP1
CRLF
INCSI
LOOPVVV
MOVAX,4C00H
INT21H
DISP1PROCNEAR
PUSHCX
MOVBL,AL
MOVDL,BL
MOVCL,04
ROLDL,CL
ANDDL,0FH
CALLDISPL
MOVDL,BL
ANDDL,0FH
CALLDISPL
POPCX
RET
DISP1ENDP
DISPLPROCNEAR
ADDDL,30H
CMPDL,3AH
JBDDD
ADDDL,27H
DDD:
MOVAH,02H
INT21H
RET
DISPLENDP
GETNUMPROCNEAR
PUSHCX
XORDX,DX
GGG:
MOVAH,01H
INT21H
CMPAL,0DH
JZPPP
CMPAL,20H
JZPPP
SUBAL,30H
JBKKK
CMPAL,0AH
JBGETS
CMPAL,11H
JBKKK
SUBAL,07H
CMPAL,0FH
JBEGETS
CMPAL,2AH
JBKKK
CMPAL,2FH
JAKKK
SUBAL,20H
GETS:
MOVCL,04
SHLDX,CL
XORAH,AH
ADDDX,AX
JMPGGG
KKK:
MOVAH,09H
MOVDX,OFFSETERROR
INT21H
PPP:
PUSHDX
CRLF
POPDX
POPCX
RET
GETNUMENDP
CODEENDS
ENDSTART
五、实验要求
1.读懂程序,写出程序注释。
2.修改程序,使其实现从大到小的排序
实验六接收年、月、日信息显示的程序
一、实验目的
掌握响铃符方法,并且掌握年、月、日的输入方法。
二、实验内容
先显示“WHATISTHEDATA(MM/DD/YY)?
”并响铃一次,然后接收键盘输入的月/日/年信息,并显示。
三、程序框图
入口
段寄存器和堆栈初始化
显示“WHATISTHEDATA”
输出响铃字符
调GETNUM,接收键入的月值,日值及年值
调DISP显示年值
输出字符“—”
调DISP显示月值
输出字符“—”
调DISP显示日值
返回DOS
四、程序清单
CRLFMACRO
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
MESSDB'WHATISTHEDATA(MM/DD/YY)?
',0DH,0AH,'$'
ERRORDB'INPUTERROR!
',0DH,0AH,'$'
DATAENDS
STACKSEGMENT
STADW32DUP(?
)
TOPDW?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVSP,TOP
MOVAH,09H
MOVDX,OFFSETMESS
INT21H
MOVAH,02H
MOVDL,07H
INT21H
CALLGETNUM
PUSHDX
CALLGETNUM
PUSHDX
CALLGETNUM
MOVAX,DX
CALLDISP
MOVAH,02H
MOVDL,’–’
INT21H
POPDX
POPAX
CALLDISPP
MOVAH,02H
MOVDL,’–’
INT21H
MOV