东华大学信息学院微机实验报告.docx
《东华大学信息学院微机实验报告.docx》由会员分享,可在线阅读,更多相关《东华大学信息学院微机实验报告.docx(58页珍藏版)》请在冰豆网上搜索。
东华大学信息学院微机实验报告
实验一基本程序编程和程序调试
一、实验目的
二、实验设备
三、实验内容及步骤
数码转换程序及其调试
1、将ASCII码表示的十进制数转换为二进制数
1)程序设计算法
2)实验步骤
3)代码4)程序流程图
地址(H)助记符注释
2000MOVSI,3500;源地址
2003MOVDI,3510;结果地址
2006MOVBX,000A;乘数10
2009MOVCX,0004;计数
200CMOVAH,00;AH清零
200EMOVAL,[SI];取被转换数
2010SUBAL,30;ASCII码变十进制数
2012IMULBX;高位(AX)*(BX)送AX
2014ADDAL,[SI+01];取下一位
1017SUBAL,30;ASCII码减30变十进制数
2019INCSI;源地址指针+1
201ALOOP2012;CX-1,若CX不等于零则继续
201CMOV[DI],AX;若CX等于零则存结果
201EINT3
图1-1
5)运行结果
2将十进制数的ASCII码转换为BCD码
1)程序设计算法
2)实验步骤
3)代码4)程序流程图
地址(H)助记符注释
2000MOVCX,0005;循环计数器赋初值
2003MOVDI,3500;ASCII码首址
2006MOVBL,FF;错误标志送BL
2008MOVAL,[DI];送ASCII码至AL
200ACMPAL,3A;比较AL与3AH
200CJNB2014;不低于3A则转2014
200ESUBAL,30;低于3A则取ASCII码的低四位
2010JB2014;低于30则转2014
2012MOVBL,AL;否则AL内容送BL,取代FF
2014MOVAL,BL;结果或错误标志送AL
2016MOV[DI+0A],AL
2019INCDI
201ALOOP2006
201CINT3
图1-2
5)运行结果:
3将十六位二进制数转换为ASCII码表示的十进制数
1)程序设计算法
2)实验步骤
3)代码4)程序流程图
地址(H)助记符注释
2000MOVDX,[3500];取二进制数
2004MOVSI,3515;目标首址在3510
2007DECSI
2008MOVAX,DX
200AMOVDX,0000
200DMOVCX,000A
2010DIVCX;;除10
2012XCHGAX,DX
2014ADDAL,30
2016MOV[SI],AL
2018CMPDX,0000
201BJNE2007
201DCMPSI,3510;填余下高位为0
2021JZ202A;
2023DECSI
2024MOVAL,30
2026MOV[SI],AL
2028JMP201D
202AINT3
图1-3
5)运行结果
4、十六进制数转换为ASCII码
1)程序设计算法
2)实验步骤
3)代码4)程序流程图
地址(H)助记符注释
2000MOVCX,0004
2003MOVDI,3500
2006MOVDX,[DI]
2008MOVAX,DX
200AANDAX,000F;取低四位值
200DCMPAL,0A;;判是否“0”-“9”
200FJB2013;是“0”-“9”转2013
2011ADDAL,07;是“A”-“F”,加7
2013ADDAL,30;转换为ASCII码
2015MOV[DI+0A],AL
2018INCDI
2019PUSHCX;保护循环计数器内容
201AMOVCL,04;移位次数送CL
201CSHRDX,CL
201EPOPCX
201FLOOP2008
2021INT3
图1-4
5)运行结果
4BCD码转换为二进制数
1)程序设计算法
2)实验步骤
3)代码4)程序流程图
地址(H)助记符注释
2000MOVCX,0004
2003MOVDI,3500
2006MOVAL,[DI]
2008ADDAL,AL;乘2
200AMOVBL,AL
200CADDAL,AL;乘2
200EADDAL,AL;乘2
2010ADDAL,BL;乘10
2012INCDI
2013MOVAH,00
2015ADDAL,[DI];BCD码十位与个位加
2017MOV[DI+0F],AX;存结果
201AINCDI
201BLOOP2006
201DINT3图1-5
5)运行结果
四、思考题
1、
2、
3、
4、
1)ASCII码→十六进制
代码:
运行结果
2)十进制小数→二进制
3)二进制→BCD码
五、实验总结
实验二程序设计和PC机上程序调试操作实验
一、实验目的
二、实验设备
三、实验内容及步骤
(一)按要求编写程序并在DEBUG下建立、汇编和调试程序
1、四字节二进制数的加法
1)程序设计要求
2)实验步骤
代码:
MOVSI,3500;源地址
MOVDI,3508;目的地址
MOVAX,[SI];取低两位运算
ADCAX,[SI+4]
MOV[DI],AX
PUSHF;将上一次加法运算后的标志位结果入栈
ADDSI,2
ADDDI,2
POPF;出栈
MOVAX,[SI];取高两位运算
ADCAX,[SI+4];带进位加法
MOV[DI],AX
INT3
运行结果:
2、数据块的搬移
1)程序设计思想和要求
2)实验步骤
3)代码:
(1)源数据块与目的数据块无重叠
MOVSI,3500
MOVDI,3510
MOVCX,10;循环16次
2009:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOP2009\
INT3
运行结果:
(2)源数据块与目的数据块有重叠。
①源数据块首地址大于目的数据块
代码:
MOVSI,3505
MOVDI,3500
MOVCX,10;循环16次
2009:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOP2009
INT3
运行结果:
②目的数据块首址大于源数据块首址
MOVSI,3500
MOVDI,3505
MOVCX,10;循环16次
2009:
MOVAL,[SI+F]
MOV[DI+F],AL
DECSI;地址指针递减
DECDI
LOOP2009
INT3
运行结果:
3、无序数据块的递增排序
1)程序设计思想和要求
2)实验步骤
代码:
2000MOVSI,3500;指定循环次数
2003MOVDI,3000
2006MOVCX,[SI]
2008DECCX
2009PUSHCX
200AMOVBX,0000
200DMOVAL,[DI+BX]
200FCMPAL,[DI+BX+1]
2012JA201B
2014INCBX
2015LOOP200D
2017POPCX
2018LOOP2009
201AINT3
201BMOVAH,[DI+BX+1]
201EMOV[DI+BX+1],AL
2021MOV[DI+BX],AH
2023JMP2014
运行结果:
4、求数的平方根
1)程序设计思想和要求
2)实验步骤
代码:
2000MOVSI,4006
2003MOVDI,4017
2006MOVCX,0004
2009:
MOVBX,0001
200CMOVDX,0000
200FMOVAH,[SI]
2011MOVAL,[SI+1]
2014CMPAX,0000
2017JE2028
2019SBBAX,BX
201BCMPAX,0000
201EJLE2027
2020INCBX
2021INCBX
2022INCDX
2023CMPAX,BX
2025JA2019
2027INCDX
2028MOV[DI],DL
202ADECDI
202BDECSI
202CDECSI
202DLOOP2009
202FINT3
运行结果:
5、思考题
(1)
(2)
(3)
6.总结
(二)MASM汇编程序和LINK连接程序的使用操作
1、计算机钢琴程序
1)实验内容
源程序为:
DATASEGMENT
MESSDB‘Pushanykeytostop!
’,0dH,0aH,’$’
TABLEDW524,588,660,698,784,880,988,1048,1176,1320,0
TABLELDB31H,31H,32H,31H,34H,33H,3BH
DB31H,31H,32H,31H,35H,34H,3BH
DB31H,31H,38H,36H,34H,33H,32H,3BH
DB36H,36H,36H,34H,35H,34H,3BH,0AAH
DATAENDS
STACKSEGMENTPARASTACK‘STACK’
STADB256DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK,ES:
DATA
STARTPROCFARDIVWORDPTR[TABLE+BX]
PUSHDSMOVBX,AX
XORAX,AXMOVAL,10110110B
PUSHAXOUT43H,AL
MOVAX,DATAMOVAX,BX
MOVDS,AXOUT42H,AL
MOVES,AXMOVAL,AH
MOVAH,09HOUT42H,AL
LEADX,MESSINAL,61H
INT21HORAL,03H
KK:
LEASI,TABLELOUT61H,AL
CALLDELAY
INAL,61H
ANDAL,0FCH
OUT61H,AL
QQ:
INCSI
SING:
MOVAH,06HJMPSING
MOVDL,0FFHFINISH:
RET
INT21HSTARTENDP
JNEFINISH
MOVAL,[SI]DELAYPROCNEAR;延时子程序
CMPAL,3BHPUSHCX
JNEDDDPUSHAX
CALLDELAYMOVAX,500H;大循环次数
JMPQQX1:
MOVCX,0FFFFH;小循环次数
DDD:
CMPAL,0AAHX2:
DECCX
JEKKJNZX2
SUBAL,31HDECAX
SHLAL,01HJNZX1
MOVBL,ALPOPAX
MOVAX,0000HPOPCX
MOVDX,12HRET
MOVBH,00HDELAYENDP
CODEENDS
ENDSTART
2、求数据块的最小值和最大值
1)实验内容
DATASEGMENT
BUFFERDB10,22,33,-80,127,-76,0,90,-45,60,-1
MINVALDB?
MAXVALDB?
DATAENDS
STACKSEGMENTPARASTACK‘STACK’
STADB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
STARTPROCFAR
PUBHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEABX,BUFFER
MOVCH,0
MOVCL,[BX]
INCBX
MOVAL,[BX]
MOVMINVAL,AL
MOVMAXVAL,AL
INCBX
DECCX
AGAIN:
MOVAL,[BX]
CMPAL,MINVAL
JENEXT
JGA1
MOVMINVAL,AL
JMPNEXT
A1:
CMPAL,MAXVAL
JLNEXT
MOVMAXVAL,AL
NEXT:
INCBX
DECCX
JNEAGAIN
RETF
STARTENDP
CODEENDS
ENDSTART
2)实验步骤
3.运行结果:
反汇编生成的代码:
结果:
最小值在141C:
B中,最大值在141:
C中。
3、从无序数列中删除一个元素
1)实验内容
2)实验步骤
代码:
DATASEGMENT
SERDB7,'ABCDEFG'
KEYDB'F'
FLAGDB0
DATAENDS
STACKSEGMENTPARASTACK'STACK'
STACDB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,ES:
DATA,SS:
STACK
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVES,AX
LEABX,SER
MOVCX,[BX]
MOVAL,KEY
AA:
INCBX
CMPAL,BYTEPTR[BX]
JEKK
LOOPAA
MOVFLAG,0FFH
JMPEN
KK:
DECCX
BB:
MOVAL,BYTEPTR[BX+1]
MOVBYTEPTR[BX],AL
INCBX
LOOPBB
EN:
RET
STARTENDP
CODEENDS
ENDSTART
运行结果:
4、思考题
①
②
③
④
5.总结
实验三DOS系统功能调用及模块化程序设计
一、实验目的
二、实验设备
三、实验内容及步骤
(一)DOS键盘、显示基本功能子程序调用
1、显示缓冲区的字符串
1)实验程序:
DSEGSEGMENT
STRINGDB‘WelcometoDONGHUAUniversity!
’,0dH,0aH,’$’
DSEGENDS
STACKSEGMENTPARASTACK‘STACK’
DB256DUP(?
)
STACKENDS
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:
CSEG,DS:
DSEGSS:
STACK
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAH,9
MOVDX,SEGSTRING
MOVDS,DX
MOVDX,OFFSETSTRING
INT21H
RET
MAINENDP
CSEGENDS
ENDSTART
2)实验步骤:
运行结果:
2、键盘输入小写字母,显示器显示大写字母
1)实验程序:
CSEGSEGMENT
MAINPROCFAR
ASSUMECS:
CSEG
START:
PUSHDS
MOVAX,0
PUSHAX
BEGIN:
MOVAH,1
INT21H
CMPAL,‘a’
JBSTOP
CMPAL,‘z’
JASTOP
SUBAL,20H
MOVDL,AL
MOVAH,2
INT21H
JMPBEGIN
STOP:
RET
MAINENDP
CSEGENDS
ENDSTART
2)实验步骤:
运行结果:
3、从键盘输入一个二位十进制的月份数(01-12),显示相应月份的英文缩写名
1)程序及其结构
程序如下:
DATASGSEGMENTPARA‘DATA’
THREEDB3
MONINDB3,4DUP(?
)
ALFMONDB‘?
?
?
’,’$’
MONTABDB‘JAN’,’FEB’,’MAR’,’APR’,’MAY’,JUN’
DB‘JUL’,’AUG’,’SEP’,’OCT’,’NOV’,’DEC’
DATASGENDS
CODESGSEGMENTPARA‘CODE’
ASSUMECS:
CODESG,DS:
DATASG
MAINPROCFAR
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATASG
MOVDS,AX
MOVES,AX
CALLINPUT
CALLLOCATE
CALLDISPLAY
RET
MAINENDP
INPUTPROCNEAR;键盘输入并将ASCⅡ码转换二进制数的子程序
PUSHDX
MOVAH,0AH;键盘输入月份数
LEADX,MONIN
INT21H
MOVAH,MONIN+2;将月份数字的ASCⅡ码取入AH和AL
MOVAL,MONIN+3
XORAX,3030H;将ASCⅡ码转换为BCD码
CMPAH,00
JZRETURN
SUBAH,AH
ADDAL,10
RETURN:
POPDX
RET
INPUT:
ENDP
LOCATEPROCNEAR;将月份数字转换为英文缩写字母的子程序
PUSHSI
PUSHDI
PUSHCX
LEASI,MONTAB
DECAL
MULTHREE
ADDSI,AX
MOVCX,03
CLD
LEADI,ALFMON
REPMOVSB
POPCX
POPDI
POPSI
RET
LOCATE:
ENDP
DISPLAYPROCNEAR;屏幕显示子程序
PUSHDX
LEADX,ALFMON
MOVAH,09
INT21H
POPDX
RET
DISPLAYENDP
CODESGENDS
ENDMAIN
运行结果:
分别输入01,09,10得到
(二)采用DOS功能调用设计源程序,并运行调试程序
1、十进制加法和结果显示程序
1)程序设计要求
2)实验步骤:
3)代码
DESGSEGMENT
ADDOP1DD9999
SUMDD?
DESGENDS
ESEGSEGMENT
ADDOP2DD9999
ESEGENDS
STACKSEGMENTPARASTACK'STACK'
DB100DUP(?
)
STACKENDS
CODESEGMENT
ASSUMEDS:
DESG,CS:
CODE,ES:
ESEG
START:
MOVAX,DESG
MOVDS,AX
MOVAX,ESEG
MOVES,AX
MOVAX,WORDPTRADDOP1
ADDAX,WORDPTRADDOP2
MOVWORDPTRSUM,AX
MOVAX,WORDPTRADDOP1+2
ADCAX,WORDPTRADDOP2+2
MOVWORDPTRSUM+2,AX
MOVBX,WORDPTRSUM+2
CALLDISPLAY
MOVBX,WORDPTRSUM
CALLDISPLAY
MOVAH,4CH
INT21H
DISPLAYPROCNEAR
MOVCX,10000D
CALLDEC_DIV
MOVCX,1000D
CALLDEC_DIV
MOVCX,100D
CALLDEC_DIV
MOVCX,10D
CALLDEC_DIV
MOVCX,1D
CALLDEC_DIV
RET
DEC_DIVPROCNEAR
MOVAX,BX
MOVDX,0
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,2H
INT21H
RET
DEC_DIVENDP
DISPLAYENDP
CODEENDS
ENDSTART
4)运行结果
反汇编
结果:
(两个加数均为9999)
2、十进制加法和算式显示程序
1)程序设计要求
2)实验步骤:
3)代码
DSEG