微机原理程序设计.docx
《微机原理程序设计.docx》由会员分享,可在线阅读,更多相关《微机原理程序设计.docx(36页珍藏版)》请在冰豆网上搜索。
微机原理程序设计
XX理工大学微机原理程序设计
-----------------------------------------------------------
实验一
实验要求:
试编写一个程序,要求比较数组ARRAY中的三个16位补码数,并根据比较结果在显示终端上显示如下信息:
(1)如果三个数都不相等则显示0;
(2)如果三个数有两个相等则显示1;
(3)如果三个数都相等则显示2。
程序流程图:
程序清单:
DATASEGMENT
ARRAYDW1,2,3
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,ARRAY
MOVBX,ARRAY+2
MOVCX,ARRAY+4
CMPAX,BX
JEL
CMPBX,CX
JEL1
CMPAX,CX
JEL1
MOVDL,30H
JMPEXIT
L:
CMPBX,CX
JNEL1
MOVDL,32H
JMPEXIT
L1:
MOVDL,31H
EXIT:
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行结果:
ARRAY中三个数互不不相等:
ARRAY中三个数有两个相等:
ARRAY中三个数都相等:
实验二
实验要求:
从键盘输入一系列字符(以回车符结束),并按字母、数字及其它字符分类计数,最后显示出这三类计数结果。
程序流程图:
程序清单:
DATASEGMENT
COUNT_OF_LETTERDB'thenumberofletteris:
','$'
COUNT_OF_NUMBERDB'thenumberofnumberis:
','$'
COUNT_OF_CHARACTERDB'thenumberofcharateris:
','$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVBH,0
MOVBL,0
MOVCL,0
NEXT:
MOVAH,1
INT21H
CMPAL,0DH
JEEXIT
CMPAL,30H
JBCOUT_OF_CHARATER_ADD
CMPAL,39H
JBECOUT_OF_NUMBER_ADD
CMPAL,41H
JBCOUT_OF_CHARATER_ADD
CMPAL,5AH
JBECOUNT_OF_LETTER_ADD
CMPAL,61H
JBCOUT_OF_CHARATER_ADD
CMPAL,7AH
JBECOUNT_OF_LETTER_ADD
COUT_OF_CHARATER_ADD:
INCCL
JMPNEXT
COUT_OF_NUMBER_ADD:
INCBL
JMPNEXT
COUNT_OF_LETTER_ADD:
INCBH
JMPNEXT
EXIT:
CALLCRLF
LEADX,COUNT_OF_LETTER
MOVAH,09
INT21H
MOVAL,BH
CALLBIN_DEC
CALLCRLF
LEADX,COUNT_OF_NUMBER
MOVAH,09
INT21H
MOVAL,BL
CALLBIN_DEC
CALLCRLF
LEADX,COUNT_OF_CHARACTER
MOVAH,09
INT21H
MOVAL,CL
CALLBIN_DEC
CALLCRLF
RET
CRLFPROCNEAR
MOVAH,02
MOVDL,0DH
INT21H
MOVAH,02
MOVDL,0AH
INT21H
RET
CRLFENDP
BIN_DECPROCNEAR
PUSHBX
PUSHCX
ANDAX,00FFH
MOVCX,0
MOVBX,0
MOVDL,10
ROTATE:
DIVDL
MOVBL,AH
ANDAX,00FFH
PUSHBX
INCCX
CMPAX,10
JAEROTATE
MOVBX,AX
PUSHBX
INCCX
CONTINUE:
POPBX
ADDBL,30H
MOVDL,BL
MOVAH,02H
INT21H
LOOPCONTINUE
POPCX
POPBX
RET
BIN_DECENDP
CODEENDS
ENDSTART
运行结果:
实验三
实验要求:
假设已编制好五个歌曲程序,它们的段地址和偏移地址存放在数据段的跳转表SONGLIST中。
试编一程序,根据从键盘输入的歌曲编号1~5,转去执行五个歌曲程序中的一个。
程序流程图:
程序清单:
DATASEGMENT
SONGLISTDWMUSIC1,MUSIC2,MUSIC3,MUSIC4,MUSIC5
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
READLIST:
MOVAH,1
INT21H
SUBAL,'0'
CMPAL,0
JEEXIT
CMPAL,5
JAREADLIST
DECAL
MOVBX,0
MOVBL,AL
ADDBX,BX
JMPSONGLIST[BX]
JMPREADLIST
MUSIC1:
MOVDL,'1'
MOVAH,2
INT21H
JMPEXIT
MUSIC2:
MOVDL,'2'
MOVAH,2
INT21H
JMPEXIT
MUSIC3:
MOVDL,'3'
MOVAH,2
INT21H
JMPEXIT
MUSIC4:
MOVDL,'4'
MOVAH,2
INT21H
JMPEXIT
MUSIC5:
MOVDL,'5'
MOVAH,2
INT21H
JMPEXIT
EXIT:
MOVAX,4C00H
INT21H
CODEENDS
ENDSTART
运行结果:
实验四
实验要求:
试编写一个程序,从键盘接收一个个位数N,然后响铃N次。
(响铃的ASCII码为07H)。
程序流程图:
程序清单:
DATASEGMENT
TIPDB'PLEASEINPUTANUMBER:
','$'
DATAENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,TIP
MOVAH,09H
INT21H
MOVAH,01H
INT21H
ANDAX,01H
MOVCX,AX
BE:
MOVDL,07H
MOVAH,02H
INT21H
LOOPBE
CODESENDS
ENDSTART
运行结果:
输入数字后听到对应次数的响铃
实验五
实验要求:
从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示计数结果。
程序流程图:
程序清单:
DATASEGMENT
S1DB0DH,0AH,'PLEASEINPUT:
$'
S2DB0DH,0AH,'TOTALNON_DIGITALARE:
$'
NUMDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
LEADX,S1
MOVAH,9
INT21H
NEXT:
MOVAH,01
INT21H
CMPAL,'$'
JEDOWN
CMPAL,'0'
JBNO09
CMPAL,'9'
JANO09
JMPNEXT
NO09:
INCNUM
JMPNEXT
DOWN:
LEADX,S2
MOVAH,9
INT21H
MOVAL,NUM
MOVAH,0
MOVDL,100
DIVDL
CALLDISP_P
MOVAL,AH
MOVAH,0
MOVDL,10
DIVDL
CALLDISP_P
XCHGAH,AL
CALLDISP_P
RET
DISP_PPROCNEAR
PUSHAX
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H
POPAX
RET
DISP_PENDP
CODEENDS
ENDSTART
运行结果:
实验六
实验要求:
试编制一个程序,把AX中存放的16进制数转换为ASCII码,并将对应的ASCII码依次存放在MEM数组中的四个字节中。
例如:
当(AX)=2A49H时,程序执行完后,MEM中的四个字节的内容为39H,34H,41H,32H。
程序流程图:
程序清单:
DATASEGMENT
MEMDB4DUP(?
)
NDW2A49H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
BEGIN:
MOVCH,4
MOVCL,4
MOVAX,N
LEABX,MEM
ROTATE:
MOVDL,AL
ANDDL,0FH
ADDDL,30H
CMPDL,3AH
JLNEXT
ADDDL,07H
NEXT:
MOV[BX],DL
INCBX
RORAX,CL
DECCH
JNZROTATE
RET
CODEENDS
ENDSTART
运行结果:
实验七
实验要求:
设有十个学生的成绩分别是76,69,84,90,73,88,99,63,100,80分,试编制一个子程序统计60~69分,70~79分,80~89分,90~99分和100分的人数,分别存放在S6,S7,S8,S9和S10单元中。
程序流程图:
程序清单:
DATASEGMENT
RESULTDB0DH,0AH,'THERESULT$'
GRADEDW76,69,84,90,73,88,99,63,100,80
S6DB0
S7DB0
S8DB0
S9DB0
S10DB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCX,10
CALLCOUNT
CALLDISP
MOVAH,1
INT21H
RET
COUNTPROCNEAR
MOVSI,0
NEXT:
MOVAX,GRADE[SI]
MOVBL,10
DIVBL
MOVBL,AL
MOVBH,0
SUBBX,6
CMPBX,0
JAENEXT1
NEXT1:
INCS6[BX]
ADDSI,2
LOOPNEXT
RET
COUNTENDP
DISPPROCNEAR
LEASI,S6
MOVCX,5
LOOP1:
MOVDX,OFFSETRESULT
MOVAH,9
INT21H
MOVDL,[SI]
ADDDL,30H
MOVAH,2
INT21H
INCSI
LOOPLOOP1
RET
DISPENDP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行结果:
实验八
实验要求:
编写一个子程序嵌套的程序模块,分别从键盘输入姓名和电话号码(8位),并以一定的格式显示出来。
主程序TELLIST:
·显示提示符INPUTNAME:
;
·调用子程序INPUT_NAME输入姓名;
·显示提示符INPUTATELEPHONENUMBER:
;
·调用子程序INPUT_PHONE输入电话号码;
·调用子程序PRINT显示姓名和电话号码。
子程序INPUT_NAME:
·调用键盘输入子程序GET_CHAR,把输入的姓名存放在IN_BUFFER缓冲区中;
·把IN_BUFFER缓冲区中的姓名移入输出行OUT_NAME。
子程序INPUT_PHONE:
·调用键盘输入子程序GET_CHAR,把输入的电话号码存放在IN_BUFFER缓冲区中;
·把IN_BUFFER缓冲区中的电话号码移入输出行OUT_PHONE。
子程序PRINT:
显示姓名及电话号码,格式为:
NAMETELPHONE
××××××
子程序CET_CHAR:
从键盘输入以回车符结尾的字符串。
程序流程图:
程序清单:
DATASEGMENT
NO_OF_NAMEDB20
NO_OF_PHONEDB8
INBUFDB20DUP(?
)
OUTNAMEDB20DUP(?
),'$'
OUTPHONEDB8DUP(?
),'$'
MESSAGE1DB'PLEASEINPUTNAME:
','$'
MESSAGE2DB'PLEASEINPUTATELEPHONENUMBER:
','$'
MESSAGE3DB'NAME',16DUP(20H),'TEL.',13,10,'$'
ERRORMESSAGE1DB'YOUSHOULDINPUT8NUMBERS!
',13,10,'$'
ERRORMESSAGE2DB'YOUINPUTAWRONGNUMBER!
',13,10,'$'
FLAGDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVFLAG,0
LEADX,MESSAGE1
MOVAH,09
INT21H
CALLINPUT_NAME
CALLCRLF
LEADX,MESSAGE2
MOVAH,09
INT21H
CALLINPHONE
CALLCRLF
CMPFLAG,1
JEEXIT
CALLPRINTLINE
EXIT:
RET
INPUT_NAMEPROCNEAR
PUSHAX
PUSHDX
PUSHCX
MOVCX,0
MOVCL,NO_OF_NAME
CALLGETCHAR
MOVAX,0
MOVAL,NO_OF_NAME
SUBAX,CX
MOVCX,AX
MOVSI,0
NEXT1:
MOVAL,INBUF[SI]
MOVOUTNAME[SI],AL
INCSI
LOOPNEXT1
POPCX
POPDX
POPAX
RET
INPUT_NAMEENDP
INPHONEPROCNEAR
PUSHAX
PUSHDX
MOVCX,0
MOVCL,NO_OF_PHONE
CALLGETCHAR
CMPCX,0
JNZERROR1
MOVCL,NO_OF_PHONE
MOVSI,0
NEXT2:
MOVAL,INBUF[SI]
CMPAL,30H
JLERROR2
CMPAL,39H
JAERROR2
MOVOUTPHONE[SI],AL
INCSI
LOOPNEXT2
JMPEXIT2
ERROR1:
CALLCRLF
LEADX,ERRORMESSAGE1
MOVAH,09
INT21H
MOVFLAG,1
JMPEXIT2
ERROR2:
CALLCRLF
LEADX,ERRORMESSAGE2
MOVAH,09
INT21H
MOVFLAG,1
JMPEXIT2
EXIT2:
POPDX
POPAX
RET
INPHONEENDP
GETCHARPROCNEAR
PUSHAX
PUSHDX
MOVDI,0
ROTATE:
MOVAH,01
INT21H
CMPAL,0DH
JEEXIT1
MOVINBUF[DI],AL
INCDI
LOOPROTATE
EXIT1:
POPDX
POPAX
RET
GETCHARENDP
CRLFPROCNEAR
PUSHAX
PUSHDX
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
POPDX
POPAX
RET
CRLFENDP
PRINTLINEPROCNEAR
PUSHAX
PUSHDX
LEADX,MESSAGE3
MOVAH,09
INT21H
LEADX,OUTNAME
MOVAH,09
INT21H
LEADX,OUTPHONE
MOVAH,09
INT21H
POPDX
POPAX
RET
PRINTLINEENDP
CODEENDS
ENDSTART
运行结果:
实验九
实验要求:
从键盘输入一个不大于65535的无符号数,然后把它转换成等值的二进制数,最后把该数以十六进制数的形式在显示器上显示出来。
编程实现。
(将有独立功能的程序用子程序独立出来)
程序流程图:
程序清单:
DATASEGMENT
BUF1DB20
DB?
DB20DUP(?
)
BUF2DB20
DB?
DB20DUP(?
)
INPUTDB'INPUT:
$'
OUTPUTDB'OUTPUT:
$'
CTRLDB0DH,0AH,'$'
SHIDW0AH
IINTDW0
DATAENDS
STACKSEGMENT
DB200DUP(0)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
LEADX,INPUT
MOVAH,9
INT21H
LEADX,BUF1
MOVAH,10
INT21H
LEADX,CTRL
MOVAH,9
INT21H
MOVCL,BUF1+1
LEASI,BUF1+2
MOVBX,0
MOVDL,[SI]
MOVDH,0
MOVAX,DX
SUBAL,30H
DECCL
INCSI
NEXT:
MUL[SHI]
ADDAH,DL
MOVDL,[SI]
MOVBL,DL
SUBBL,30H
ADDAX,BX
DECCL
INCSI
CMPCL,0
JNENEXT
MOV[IINT],AX
MOVCL,0
MOVAX,[IINT]
MOVDX,0
TO:
MOVBX,16
DIVBX
MOVBX,AX
PUSHDX
INCCL
MOVAX,BX
MOVDX,0
CMPAX,0
JNETO
MOVBL,4
SUBBL,CL
MOVCL,BL