当前位置:文档之家› 8086汇编语言程序设计

8086汇编语言程序设计

实验1 简单汇编语言程序设计一、实验目的与要求1.熟悉汇编语言运行、调试环境及方法。

2.掌握简单汇编语言程序的设计方法。

3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。

二、实验内容根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。

1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的地址。

试编写汇编程序,完成Z←((W-X) ÷5-Y)⨯(R+ 2) 。

2.试编写一个程序,测试某数是否是奇数。

如该数是奇数,则把DL 的第0位置1,否则将该位置0。

三、实验报告要求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个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。

请编程完成此功能。

数据缓冲区参考数据定义如下:EXAMSCORE DB 01 ;学号DB 89,76,54,77,99 ;单科成绩DW ? ;该学生的总分DB 02 ;学号DB 79,88,64,97,92 ;单科成绩DW ? ;该学生的总分三、实验报告要求1.程序算法流程图。

2.源程序清单。

3.程序运行结果。

4.调试过程中遇到的问题和解决的方法。

实验4 综合程序设计一、实验目的与要求1.熟悉汇编语言运行、调试环境及方法。

2.掌握汇编语言程序的设计方法。

3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。

二、实验内容根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。

1. 编写汇编程序接收用户从键盘键入的月份数,在终端上显示该月的英文缩写名。

当用户按下ESC键时,程序退出,返回DOS。

参考程序执行过程如下:month?5↙MAY month?9↙SEP month?2. 按15行×16列的表格形式显示ASCII码为10H~FFH的所有字符。

每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII码为0)分隔。

3.在第2题程序的基础上进行修改。

将显示表格的行、列数由固定的15行16列改为由用户从键盘输入。

然后,按用户输入的行列值进行显示。

4.编写汇编程序将内存数据区保存的若干个带符号16位数据按从大到小的顺序排列后,以十进制真值的形式在屏幕上显示。

三、实验报告要求1.程序算法流程图。

2.源程序清单。

3.程序运行结果。

4.调试过程中遇到的问题和解决的方法。

源程序:1.1****************************************************************** DATA SEGMENTx DB 3y DB 1z dw ?w db 23r db 6DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov al,wsub al,[x]cbwmov bl,5idiv blsub al,[y]mov bl,radd bl,2imul blmov [z],axMOV AH,4CHINT 21HCODE ENDSEND START1.2****************************************************************** DATA SEGMENTx db 63y db ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov al,[x]shr dl,1shr al,1rcl dl,1mov [y],dlMOV AH,4CHINT 21HCODE ENDSEND START2.1****************************************************************** DATA SEGMENTSTRING DB 'g3tRfdtf TR34'MESSAGEONE DB 'Please input the number of string(<10):$'MESSAGETWO DB 'The number of string is:$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov ah,9mov dx,offset messageoneint 21hMOV AH,1INT 21HMOV BL,ALMOV DL,10MOV AH,2INT 21HSUB BL,30HCBWMOV CX,BXMOV AL,0MOV BX,OFFSET STRINGBEGIN:MOV DL,[BX]CMP DL,'a'JB RECMP DL,'z'JA REINC ALRE:INC BXLOOP BEGINADD AL,30Hmov bl,almov ah,9mov dx,offset messagetwoint 21hMOV DL,BLMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START2.2****************************************************************** DATA SEGMENTMAXLEN DB 32ACTLEN DB ?STRINGONE DB 32 DUP(?)STRINGTWO DB 32 DUP(?)MESSAGEONE DB 'Please input the string(<31):$'MESSAGETWO DB 'The encryptic string is:$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXmov ah,9mov dx,offset messageoneint 21hMOV DX,OFFSET MAXLENMOV AH,0AHINT 21HSUB CH,CHMOV CL,ACTLENADD DX,2MOV BX,DXMOV BP,OFFSET STRINGTWOMOV DL,10MOV AH,2INT 21HBEGIN:MOV DL,[BX]SUB DL,20HMOV [BP],DLINC BXINC BPLOOP BEGINmov AL,'$'MOV [BP],ALmov ah,9mov dx,offset messagetwoint 21hMOV AH,9MOV DX,OFFSET STRINGTWOINT 21HMOV AH,4CHINT 21HCODE ENDSEND START3.1****************************************************************** CODE SEGMENTMAIN PROC FARASSUME CS:CODESTART:PUSH DSSUB AX,AXPUSH AXMOV AX,0101111010010101BCALL DISPDECCALL CRLFCALL DISPHEXRETMAIN ENDPDISPDEC PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV BX,AXMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVPOPFPOP DXPOP CXPOP BXPOP AXRETDEC_DIV PROC NEAR MOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,2INT 21HRETDEC_DIV ENDP DISPDEC ENDPDISPHEX PROC NEAR PUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV BX,AXMOV CH,4MOV CL,4 ROTATE:ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7H PRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATEPOPFPOP DXPOP CXPOP BXPOP AXRETDISPHEX ENDPCRLF PROC NEARPUSH AXPUSH DXMOV DL,0AHMOV AH,2INT 21HPOP DXPOP AXRETCRLF ENDPCODE ENDSEND START3.2****************************************************************** DATA SEGMENTEXAMSCORE DB 01DB 89,76,54,77,99DW ?DB 02DB 79,88,64,97,92DW ?DB 03DB 43,45,67,87,98DW ?DB 04DB 76,65,27,76,98DW ?DB 05DB 67,78,23,87,87DW ?DATA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXMOV CX,5MOV BX,OFFSET EXAMSCORE RE:INC BXCALL SUMCALL DISPDECCALL CRLFADD BX,2LOOP RERETMAIN ENDPSUM PROC NEARPUSH CXPUSH DXPUSHFMOV AX,0MOV CX,5BEGAIN:MOV DL,[BX]MOV DH,0ADC AX,DXINC BXLOOP BEGAINMOV [BX],AXPOPFPOP DXPOP CXRETSUM ENDPDISPDEC PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV BX,AXMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVPOPFPOP DXPOP CXPOP BXPOP AXRETDEC_DIV PROC NEARMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,2INT 21HRETDEC_DIV ENDPDISPDEC ENDPCRLF PROC NEARPUSH AXPUSH DXMOV DL,0AHMOV AH,2INT 21HPOP DXPOP AXRETCRLF ENDPCODE ENDSEND START实验3扩展************************************************************;**********************************data segmentstring0 db 'error!$'string1 db 'input dec number:$'string2 db 'input hex number:$'string301 db 'output dec number(1):$' string302 db 'output dec number(2):$' X DB 5 DUP(?)string4 db 'output hex number:$'data ends;***********************************;*********************************** CODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATASTART:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AXCALL KEY_DECCALL CRLFCALL DISPDECCALL CRLFCALL DISPDECZCALL CRLFCALL DISPHEXCALL CRLFCALL KEY_HEXCALL CRLFCALL DISPDECCALL CRLFCALL DISPDECZCALL CRLFCALL DISPHEXRETMAIN ENDP;********************************;********************************;输入十进制数并用二进制存储在BX中KEY_DEC PROC NEARPUSH AXPUSH CXPUSH DXPUSHFREERR:MOV DX,OFFSET STRING1MOV AH,9INT 21HMOV BX,0DEC_RE:MOV AH,1INT 21HCMP AL,0DHJE DEC_EXITSUB AL,30HJL DEC_ERRCMP AL,9JG DEC_ERRCBWXCHG AX,BXMOV CX,10MUL CXXCHG AX,BXADD BX,AXJMP DEC_REDEC_ERR:CALL ERRORJMP REERRDEC_EXIT:POPFPOP DXPOP CXPOP AXRETKEY_DEC ENDP;**********************************;********************************** ;输入十六进制数并用二进制存储在BX中KEY_HEX PROC NEARPUSH AXPUSH CXPUSH DXPUSHFHEX_REERR:MOV DX,OFFSET STRING2MOV AH,9INT 21HMOV BX,0HEX_RE:MOV AH,1INT 21HCMP AL,0DHJE HEX_EXITSUB AL,30HJL HEX_ERRCMP AL,0AHJL NEXTSUB AL,7CMP AL,0AHJL HEX_ERRCMP AL,10HJL NEXTSUB AL,20HCMP AL,0AHJL HEX_ERRCMP AL,10HJNL HEX_ERRNEXT:MOV CL,4SHL BX,CLMOV AH,0ADD BX,AXJMP HEX_REHEX_ERR:CALL ERRORJMP HEX_REERRHEX_EXIT:POPFPOP DXPOP CXPOP AXRETKEY_HEX ENDP;********************************;******************************** ;用十进制输出BX中二进制的数方法一DISPDEC PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV DX,OFFSET STRING301MOV AH,9INT 21HMOV CX,10000DCALL DEC_DIVMOV CX,1000DCALL DEC_DIVMOV CX,100DCALL DEC_DIVMOV CX,10DCALL DEC_DIVMOV CX,1DCALL DEC_DIVPOPFPOP DXPOP CXPOP BXPOP AXRETDEC_DIV PROC NEARMOV AX,BXMOV DX,0DIV CXMOV BX,DXMOV DL,ALADD DL,30HMOV AH,2INT 21HRETDEC_DIV ENDPDISPDEC ENDP;**********************************;********************************** ;用十进制输出BX中二进制的数方法二DISPDECZ PROC NEARPUSH AXPUSH BXPUSH CXPUSH DXPUSHFMOV DX,OFFSET STRING302MOV AH,9INT 21HMOV AX,BXmov BX,0dispdecz_re:MOV DX,0MOV CX,10DDIV CXMOV X[BX],DLINC BXcmp ax,0JNE DISPDECZ_REdispdecz_next:CMP BX,0JE DISPDECZ_EXITDEC BXMOV DL,X[BX]ADD DL,30HMOV AH,2INT 21HJMP DISPDECZ_NEXTDISPDECZ_EXIT:POPFPOP DXPOP CXPOP BXPOP AXRETDISPDECZ ENDP;******************************;******************************* ;用十六进制输出BX中二进制数DISPHEX PROC NEARPUSH AXPUSH CXPUSH DXPUSHFMOV DX,OFFSET STRING4MOV AH,9INT 21HMOV CH,4MOV CL,4ROTATE:ROL BX,CLMOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7HPRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATEPOPFPOP DXPOP CXPOP AXRETDISPHEX ENDP;******************************;****************************** ;输出换行符CRLF PROC NEARPUSH AXPUSH DXMOV DL,0AHMOV AH,2INT 21HMOV DL,0DHMOV AH,2INT 21HPOP DXPOP AXRETCRLF ENDP;********************************;******************************** ;输出错误提示ERROR PROC NEARPUSH AXPUSH DXPUSHFCALL CRLFMOV DX,OFFSET STRING0MOV AH,9INT 21HCALL CRLFPOPFPOP DXPOP AXRETERROR ENDP;********************************;********************************CODE ENDSEND START4.1****************************************************************** DATA SEGMENTMONTH DB'JAN','FEB','MAR','APR','MAY','JUN','JUL','AUG','SEP','OCT','NOV','DE C'NUM DB 2 DUP(?)STRONE DB 'month?',10,'$'STRTWO DB 'month ERROR!',10,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXBEGIN:MOV DX,OFFSET STRONEMOV AH,9INT 21HMOV BX,0MOV [NUM],BLMOV [NUM+1],BLRE:MOV AH,1INT 21HCMP AL,1BHJE EXITCMP AL,0DHJE NEXTCMP AL,30HJB ERRORCMP AL,39HJA ERRORCMP BX,2JZ ERRORMOV NUM[BX],ALINC BXJMP RENEXT:MOV AL,[NUM]SUB AL,30HJE ERRORMOV BL,[NUM+1]CMP BL,0JE GOSUB BL,30HMOV AH,10MUL AHADD AL,BLCMP AL,12JA ERRORGO:MOV CX,3DEC ALMOV AH,3MUL AHMOV BX,OFFSET MONTHADD BX,AXMOV DL,10MOV AH,2INT 21HOUTPUT:MOV DL,[BX]MOV AH,2INT 21HINC BXLOOP OUTPUTMOV DL,0AHMOV AH,2... INT 21H JMP BEGINERROR:MOV DL,0AHMOV AH,2INT 21HMOV DX,OFFSET STRTWOMOV AH,9INT 21HJMP BEGINEXIT:MOV AH,4CHINT 21HCODE ENDSEND START4.2****************************************************************** CODE SEGMENTASSUME CS:CODESTART:MOV bh,15MOV BL,0FHREONE:MOV CX,16RETWO:INC BLMOV AH,2MOV DL,BLINT 21HMOV DL,0INT 21HLOOP RETWOMOV AH,2MOV DL,0AHINT 21HDEC bhJNZ REONEMOV AH,4CHINT 21HCODE ENDSEND START。

相关主题