8086汇编语言程序设计.docx
《8086汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《8086汇编语言程序设计.docx(22页珍藏版)》请在冰豆网上搜索。
![8086汇编语言程序设计.docx](https://file1.bdocx.com/fileroot1/2022-12/6/f982e15d-3648-4ee9-9e5d-269fe4e50107/f982e15d-3648-4ee9-9e5d-269fe4e501071.gif)
8086汇编语言程序设计
实验1简单汇编语言程序设计
一、实验目的与要求
1.熟悉汇编语言运行、调试环境及方法。
2.掌握简单汇编语言程序的设计方法。
3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。
二、实验内容
根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。
1.若X、Y、R、W是存放8位带符号数字节单元的地址,Z是16位字单元的
地址。
试编写汇编程序,完成Z((WX)5Y)(R2)o
2.试编写一个程序,测试某数是否是奇数。
如该数是奇数,则把DL的第0
位置1,否则将该位置00
三、实验报告要求
1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
实验2分支及循环程序设计
一、实验目的与要求
1.熟悉汇编语言运行、调试环境及方法。
2.掌握分支程序和循环程序的设计方法。
3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。
二、实验内容
根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。
1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。
2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。
参考加密方法是:
每个数乘以2。
(说明:
本题的加密方法,同学们可以自己拟定)
三、实验报告要求
1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
实验3子程序程序设计
一、实验目的与要求
1.熟悉汇编语言运行、调试环境及方法。
2.掌握子程序的设计方法。
3,熟悉调试工具DEBUG,并运用DEBUG工具调试程序。
二、实验内容
根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。
1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。
2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并
调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。
请编程完成此功能。
数据缓冲区参考数据定义如下:
EXAMSCOREDB01;学号
DB89,76,54,77,99;单科成绩
DW?
;该学生的总分
DB02;学号
DB79,88,64,97,92;单科成绩
DW?
;该学生的总分
三、实验报告要求
1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
实验4综合程序设计
一、实验目的与要求
1.熟悉汇编语言运行、调试环境及方法。
2.掌握汇编语言程序的设计方法。
3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。
二、实验内容
根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。
1.编写汇编程序接收用户从键盘键入的月份数,在终端上显示该月的英文缩写名。
当用户按下ESC键时,程序退出,返回DOS。
参考程序执行过程如下:
month?
5/MAYmonth?
9/SEPmonth?
2.按15行X16列的表格形式显示ASCII码为10H〜FFH的所有字符。
每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII码为0)分隔。
3.在第2题程序的基础上进行修改。
将显示表格的行、列数由固定的15行16列改
为由用户从键盘输入。
然后,按用户输入的行列值进行显示。
4.编写汇编程序将内存数据区保存的若干个带符号16位数据按从大到小的顺序排列后,以十进制真值的形式在屏幕上显示。
三、实验报告要求
1.程序算法流程图。
2.源程序清单。
3.程序运行结果。
4.调试过程中遇到的问题和解决的方法。
1.1******************************************************************DATASEGMENT
xDB3
yDB1zdw?
wdb23
rdb6
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AXmoval,wsubal,[x]cbwmovbl,5idivblsubal,[y]movbl,raddbl,2imulblmov[z],ax
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
1.2******************************************************************DATASEGMENT
xdb63
ydb?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATAMOVDS,AXmoval,[x]shrdl,1shral,1
rcldl,1
mov[y],dl
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.1******************************************************************
DATASEGMENT
STRINGDB'g3tRfdtfTR34'
MESSAGEONEDB'Pleaseinputthenumberofstring(<10):
$
MESSAGETWODB'Thenumberofstringis:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
movah,9
movdx,offsetmessageoneint21h
MOVAH,1
INT21H
MOVBL,AL
MOVDL,10
MOVAH,2
INT21H
SUBBL,30H
CBW
MOVCX,BX
MOVAL,0
MOVBX,OFFSETSTRING
BEGIN:
MOVDL,[BX]
CMPDL,'a'
JBRE
CMPDL,'z'
JARE
INCAL
RE:
INCBX
LOOPBEGIN
ADDAL,30H
movbl,al
movah,9
movdx,offsetmessagetwoint21h
MOVDL,BL
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
2.2******************************************************************DATASEGMENT
MAXLENDB32
ACTLENDB?
STRINGONEDB32DUP⑺
STRINGTWODB32DUP⑺
MESSAGEONEDB'Pleaseinputthestring(<31):
$'
MESSAGETWODB'Theencrypticstringis:
$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATASTART:
MOVAX,DATA
MOVDS,AXmovah,9movdx,offsetmessageoneint21h
MOVDX,OFFSETMAXLEN
MOVAH,0AH
INT21H
SUBCH,CH
MOVCL,ACTLEN
ADDDX,2
MOVBX,DX
MOVBP,OFFSETSTRINGTWO
MOVDL,10
MOVAH,2
INT21H
BEGIN:
MOVDL,[BX]
SUBDL,20HMOV[BP],DL
INCBX
INCBP
LOOPBEGIN
movAL,'$'
MOV[BP],AL
movah,9
movdx,offsetmessagetwoint21h
MOVAH,9
MOVDX,OFFSETSTRINGTWO
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.1******************************************************************
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,0101111010010101B
CALLDISPDEC
CALLCRLF
CALLDISPHEX
RET
MAINENDP
DISPDECPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHF
MOVBX,AX
MOVCX,10000D
CALLDEC_DIV
MOVCX,1000D
CALLDEC_DIV
MOVCX,100D
CALLDEC_DIV
MOVCX,10D
CALLDEC_DIVMOVCX,1DCALLDEC_DIVPOPFPOPDXPOPCXPOPBXPOPAXRET
DEC_DIVPROCNEARMOVAX,BXMOVDX,0DIVCXMOVBX,DXMOVDL,ALADDDL,30HMOVAH,2INT21HRET
DEC_DIVENDPDISPDECENDP
DISPHEXPROCNEAR
PUSHAXPUSHBXPUSHCXPUSHDXPUSHFMOVBX,AXMOVCH,4MOVCL,4
ROTATE:
ROLBX,CLMOVAL,BLANDAL,0FHADDAL,30HCMPAL,3AHJLPRINTITADDAL,7H
PRINTIT:
MOVDL,ALMOVAH,2INT21H
DECCH
JNZROTATE
POPF
POPDX
POPCX
POPBX
POPAX
RETDISPHEXENDP
CRLFPROCNEARPUSHAXPUSHDXMOVDL,0AHMOVAH,2INT21HPOPDX
POPAXRET
CRLFENDP
CODEENDS
ENDSTART
3.2******************************************************************
DATASEGMENT
EXAMSCOREDB01
DB89,76,54,77,99
DB02
DB79,88,64,97,92
DB03
DB43,45,67,87,98
DB04
DB76,65,27,76,98
DB05
DB67,78,23,87,87
DATAENDS
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATA
START:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVCX,5
MOVBX,OFFSETEXAMSCORE
RE:
INCBX
CALLSUM
CALLDISPDEC
CALLCRLF
ADDBX,2
LOOPRE
RET
MAINENDP
SUMPROCNEAR
PUSHCX
PUSHDX
PUSHF
MOVAX,0
MOVCX,5
BEGAIN:
MOVDL,[BX]
MOVDH,0
ADCAX,DX
INCBX
LOOPBEGAIN
MOV[BX],AX
POPF
POPDX
POPCX
RET
SUMENDP
DISPDECPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHF
MOVBX,AX
MOVCX,10000D
CALLDEC_DIV
MOVCX,1000D
CALLDEC_DIV
MOVCX,100D
CALLDEC_DIV
MOVCX,10D
CALLDEC_DIV
MOVCX,1D
CALLDEC_DIV
POPF
POPDX
POPCX
POPBX
POPAX
RET
DEC_DIVPROCNEAR
MOVAX,BX
MOVDX,0
DIVCX
MOVBX,DX
MOVDL,AL
ADDDL,30H
MOVAH,2
INT21H
RET
DEC_DIVENDP
DISPDECENDP
CRLFPROCNEAR
PUSHAX
PUSHDX
MOVDL,0AH
MOVAH,2
INT21H
POPDX
POPAX
RET
CRLFENDP
CODEENDS
ENDSTART
实验3扩展************************************************************
.**********************************
datasegment
string。
db'error!
$'
stringldb'inputdecnumber:
$'string2db'inputhexnumber:
$'string301db'outputdecnumber
(1):
$string302db'outputdecnumber
(2):
$XDB5DUP⑺
string4db'outputhexnumber:
$'dataends
.***********************************;
;***********************************;
CODESEGMENT
MAINPROCFAR
ASSUMECS:
CODE,DS:
DATASTART:
PUSHDS
SUBAX,AX
PUSHAX
MOVAX,DATA
MOVDS,AX
CALLKEY_DEC
CALLCRLF
CALLDISPDEC
CALLCRLF
CALLDISPDECZ
CALLCRLF
CALLDISPHEX
CALLCRLF
CALLKEY_HEX
CALLCRLF
CALLDISPDEC
CALLCRLF
CALLDISPDECZ
CALLCRLF
CALLDISPHEX
RET
MAINENDP
.********************************;
:
********************************
;输入十进制数并用二进制存储在BX^KEY_DECPROCNEAR
PUSHAX
PUSHCX
PUSHDX
PUSHF
REERR:
MOVDX,OFFSETSTRING1
MOVAH,9
INT21H
MOVBX,0
DEC_RE:
MOVAH,1
INT21H
CMPAL,0DH
JEDEC_EXIT
SUBAL,30H
JLDEC_ERR
CMPAL,9
JGDEC_ERR
CBW
XCHGAX,BX
MOVCX,10
MULCX
XCHGAX,BX
ADDBX,AX
JMPDEC_RE
DEC_ERR:
CALLERROR
JMPREERR
DEC_EXIT:
POPF
POPDX
POPCX
POPAX
RET
KEY_DECENDP
.**********************************;
;**********************************
;输入十六进制数并用二进制存储在B>e
KEY_HEXPROCNEAR
PUSHAX
PUSHCX
PUSHDX
PUSHF
HEX_REERR:
MOVDX,OFFSETSTRING2
MOVAH,9
INT21H
MOVBX,0HEX_RE:
MOVAH,1
INT21H
CMPAL,0DH
JEHEX_EXIT
SUBAL,30H
JLHEX_ERR
CMPAL,0AHJLNEXTSUBAL,7CMPAL,0AHJLHEX_ERRCMPAL,10HJLNEXTSUBAL,20HCMPAL,0AHJLHEX_ERRCMPAL,10HJNLHEX_ERRNEXT:
MOVCL,4
SHLBX,CL
MOVAH,0
ADDBX,AX
JMPHEX_REHEX_ERR:
CALLERROR
JMPHEX_REERRHEX_EXIT:
POPF
POPDX
POPCX
POPAXRETKEY_HEXENDP.********************************;
;********************************;
;用十进制输出BX^二进制的数方法
DISPDECPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHF
MOVDX,OFFSETSTRING301MOVAH,9INT21H
MOVCX,10000DCALLDEC_DIVMOVCX,1000DCALLDEC_DIVMOVCX,100DCALLDEC_DIVMOVCX,10DCALLDEC_DIVMOVCX,1DCALLDEC_DIVPOPF
POPDXPOPCXPOPBXPOPAXRETDEC_DIVPROCNEAR
MOVAX,BX
MOVDX,0DIVCXMOVBX,DXMOVDL,ALADDDL,30HMOVAH,2INT21HRET
DEC_DIVENDPDISPDECENDP.**********************************;
;**********************************;用十进制输出BX^二进制的数方法二DISPDECZPROCNEAR
PUSHAXPUSHBX
PUSHCX
PUSHDX
PUSHF
MOVDX,OFFSETSTRING302
MOVAH,9
INT21H
MOVAX,BX
movBX,0dispdecz_re:
MOVDX,0
MOVCX,10D
DIVCX
MOVX[BX],DL
INCBX
cmpax,0
JNEDISPDECZ_REdispdecz_next:
CMPBX,0
JEDISPDECZ_EXIT
DECBX
MOVDL,X[BX]
ADDDL,30H
MOVAH,2
INT21H
JMPDISPDECZ_NEXTDISPDECZ_EXIT:
POPF
POPDX
POPCX
POPBX
POPAX
RET
DISPDECZENDP.******************************;
;*******************************;
;用十六进制输出BX^二进制数DISPHEXPROCNEAR
PUSHAX
PUSHCX
PUSHDX
PUSHF
MOVDX,OFFSETSTRING4
INT21H
MOVCH,4
MOVCL,4
ROTATE:
ROLBX,CL
MOVAL,BL
ANDAL,0FH
ADDAL,30H
CMPAL,3AH
JLPRINTIT
ADDAL,7H
PRINTIT:
MOVDL,AL
MOVAH,2
INT21H
DECCH
JNZROTATE
POPF
POPDX
POPCX
POPAX
RET
DISPHEXENDP
.******************************;
;******************************;
;输出换行符
CRLFPROCNEAR
PUSHAX
PUSHDX
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
POPDX
POPAX
RET
CRLFENDP
.********************************;
;********************************;
;输出错误提示
ERRORPROCNEAR
PUSHAX
PUSHDX
PUSHF
CALLCRLF
MOVDX,OFFSETSTRING0
MOVAH,9INT21H
CALLCRLF
POPF
POPDX
POPAX
RET
ERRORENDP
.********************************;
;********************************;
CODEENDS
ENDSTART
4.1******************************************************************
DATASEGMENT
MONTHDB
'JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DEC'
NUMDB2DUP⑺
STRONEDB'month?
',10,$
STRTWODB'monthERROR!
',10,'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
BEGIN:
MOVDX,OFFSETSTRONE
MOVAH,9
INT21H
MOVBX,0
MOV[NUM],BL
M