8086汇编语言程序设计.pdf
1/21 实验1 简单汇编语言程序设计 一、实验目的与要求 1熟悉汇编语言运行、调试环境及方法。2掌握简单汇编语言程序的设计方法。3熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具 调试程序,验证程序的正确性。1.若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z(WX)5Y)(R 2)。2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。三、实验报告要求 1.程序算法流程图。2.源程序清单。3.程序运行结果。4.调试过程中遇到的问题和解决的方法。2/21 实验2 分支及循环程序设计 一、实验目的与要求 1熟悉汇编语言运行、调试环境及方法。2掌握分支程序和循环程序的设计方法。3熟悉调试工具DEBUG,并运用DEBUG工具调试程序。二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定)三、实验报告要求 1.程序算法流程图。2.源程序清单。3.程序运行结果。4.调试过程中遇到的问题和解决的方法。3/21 实验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/21 实验4 综合程序设计 一、实验目的与要求 1熟悉汇编语言运行、调试环境及方法。2掌握汇编语言程序的设计方法。3熟悉调试工具DEBUG,并运用DEBUG工具调试程序。二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。1.编写汇编程序接收用户从键盘键入的月份数,在终端上显示该月的英文缩写名。当用户按下ESC键时,程序退出,返回DOS。参考程序执行过程如下:month?5 MAY month?9 SEP month?2.按15行16列的表格形式显示ASCII码为10HFFH的所有字符。每16个字符为一行,每行中的相邻两个字符之间用空白符(ASCII码为0)分隔。3.在第2题程序的基础上进行修改。将显示表格的行、列数由固定的15行16列改为由用户从键盘输入。然后,按用户输入的行列值进行显示。4.编写汇编程序将内存数据区保存的若干个带符号16位数据按从大到小的顺序排列后,以十进制真值的形式在屏幕上显示。三、实验报告要求 1.程序算法流程图。2.源程序清单。3.程序运行结果。4.调试过程中遇到的问题和解决的方法。5/21 源程序:1.1*DATA SEGMENT x DB 3 y DB 1 z dw?w db 23 r db 6 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX mov al,w sub al,x cbw mov bl,5 idiv bl sub al,y mov bl,r add bl,2 imul bl mov z,ax MOV AH,4CH INT 21H CODE ENDS END START 1.2*DATA SEGMENT x db 63 y db?DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX mov al,x shr dl,1 shr al,1 6/21 rcl dl,1 mov y,dl MOV AH,4CH INT 21H CODE ENDS END START 2.1*DATA SEGMENT STRING DB g3tRfdtf TR34 MESSAGEONE DB Please input the number of string(10):$MESSAGETWO DB The number of string is:$DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX mov ah,9 mov dx,offset messageone int 21h MOV AH,1 INT 21H MOV BL,AL MOV DL,10 MOV AH,2 INT 21H SUB BL,30H CBW MOV CX,BX MOV AL,0 MOV BX,OFFSET STRING BEGIN:MOV DL,BX CMP DL,a JB RE CMP DL,z JA RE INC AL RE:INC BX LOOP BEGIN ADD AL,30H 7/21 mov bl,al mov ah,9 mov dx,offset messagetwo int 21h MOV DL,BL MOV AH,2 INT 21H MOV AH,4CH INT 21H CODE ENDS END START 2.2*DATA SEGMENT MAXLEN DB 32 ACTLEN DB?STRINGONE DB 32 DUP(?)STRINGTWO DB 32 DUP(?)MESSAGEONE DB Please input the string(31):$MESSAGETWO DB The encryptic string is:$DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX mov ah,9 mov dx,offset messageone int 21h MOV DX,OFFSET MAXLEN MOV AH,0AH INT 21H SUB CH,CH MOV CL,ACTLEN ADD DX,2 MOV BX,DX MOV BP,OFFSET STRINGTWO MOV DL,10 MOV AH,2 INT 21H BEGIN:MOV DL,BX SUB DL,20H MOV BP,DL 8/21 INC BX INC BP LOOP BEGIN mov AL,$MOV BP,AL mov ah,9 mov dx,offset messagetwo int 21h MOV AH,9 MOV DX,OFFSET STRINGTWO INT 21H MOV AH,4CH INT 21H CODE ENDS END START 3.1*CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE START:PUSH DS SUB AX,AX PUSH AX MOV AX,10101B CALL DISPDEC CALL CRLF CALL DISPHEX RET MAIN ENDP DISPDEC PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSHF MOV BX,AX MOV CX,10000D CALL DEC_DIV MOV CX,1000D CALL DEC_DIV MOV CX,100D CALL DEC_DIV MOV CX,10D 9/21 CALL DEC_DIV MOV CX,1D CALL DEC_DIV POPF POP DX POP CX POP BX POP AX RET DEC_DIV PROC NEAR MOV AX,BX MOV DX,0 DIV CX MOV BX,DX MOV DL,AL ADD DL,30H MOV AH,2 INT 21H RET DEC_DIV ENDP DISPDEC ENDP DISPHEX PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSHF MOV BX,AX MOV CH,4 MOV CL,4 ROTATE:ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL PRINTIT ADD AL,7H PRINTIT:MOV DL,AL MOV AH,2 INT 21H DEC CH 10/21 JNZ ROTATE POPF POP DX POP CX POP BX POP AX RET DISPHEX ENDP CRLF PROC NEAR PUSH AX PUSH DX MOV DL,0AH MOV AH,2 INT 21H POP DX POP AX RET CRLF ENDP CODE ENDS END START 3.2*DATA SEGMENT EXAMSCORE DB 01 DB 89,76,54,77,99 DW?DB 02 DB 79,88,64,97,92 DW?DB 03 DB 43,45,67,87,98 DW?DB 04 DB 76,65,27,76,98 DW?DB 05 DB 67,78,23,87,87 DW?DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA 11/21 START:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX MOV CX,5 MOV BX,OFFSET EXAMSCORE RE:INC BX CALL SUM CALL DISPDEC CALL CRLF ADD BX,2 LOOP RE RET MAIN ENDP SUM PROC NEAR PUSH CX PUSH DX PUSHF MOV AX,0 MOV CX,5 BEGAIN:MOV DL,BX MOV DH,0 ADC AX,DX INC BX LOOP BEGAIN MOV BX,AX POPF POP DX POP CX RET SUM ENDP DISPDEC PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSHF MOV BX,AX 12/21 MOV CX,10000D CALL DEC_DIV MOV CX,1000D CALL DEC_DIV MOV CX,100D CALL DEC_DIV MOV CX,10D CALL DEC_DIV MOV CX,1D CALL DEC_DIV POPF POP DX POP CX POP BX POP AX RET DEC_DIV PROC NEAR MOV AX,BX MOV DX,0 DIV CX MOV BX,DX MOV DL,AL ADD DL,30H MOV AH,2 INT 21H RET DEC_DIV ENDP DISPDEC ENDP CRLF PROC NEAR PUSH AX PUSH DX MOV DL,0AH MOV AH,2 INT 21H POP DX POP AX RET CRLF ENDP CODE ENDS END START 实验3扩展*13/21;*data segment string0 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 SEGMENT MAIN PROC FAR ASSUME CS:CODE,DS:DATA START:PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX CALL KEY_DEC CALL CRLF CALL DISPDEC CALL CRLF CALL DISPDECZ CALL CRLF CALL DISPHEX CALL CRLF CALL KEY_HEX CALL CRLF CALL DISPDEC CALL CRLF CALL DISPDECZ CALL CRLF CALL DISPHEX RET MAIN ENDP;*;*;输入十进制数并用二进制存储在BX中 KEY_DEC PROC NEAR 14/21 PUSH AX PUSH CX PUSH DX PUSHF REERR:MOV DX,OFFSET STRING1 MOV AH,9 INT 21H MOV BX,0 DEC_RE:MOV AH,1 INT 21H CMP AL,0DH JE DEC_EXIT SUB AL,30H JL DEC_ERR CMP AL,9 JG DEC_ERR CBW XCHG AX,BX MOV CX,10 MUL CX XCHG AX,BX ADD BX,AX JMP DEC_RE DEC_ERR:CALL ERROR JMP REERR DEC_EXIT:POPF POP DX POP CX POP AX RET KEY_DEC ENDP;*;*;输入十六进制数并用二进制存储在BX中 KEY_HEX PROC NEAR PUSH AX PUSH CX PUSH DX PUSHF 15/21 HEX_REERR:MOV DX,OFFSET STRING2 MOV AH,9 INT 21H MOV BX,0 HEX_RE:MOV AH,1 INT 21H CMP AL,0DH JE HEX_EXIT SUB AL,30H JL HEX_ERR CMP AL,0AH JL NEXT SUB AL,7 CMP AL,0AH JL HEX_ERR CMP AL,10H JL NEXT SUB AL,20H CMP AL,0AH JL HEX_ERR CMP AL,10H JNL HEX_ERR NEXT:MOV CL,4 SHL BX,CL MOV AH,0 ADD BX,AX JMP HEX_RE HEX_ERR:CALL ERROR JMP HEX_REERR HEX_EXIT:POPF POP DX POP CX POP AX RET KEY_HEX ENDP;*;*;用十进制输出BX中二进制的数方法一 16/21 DISPDEC PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX PUSHF MOV DX,OFFSET STRING301 MOV AH,9 INT 21H MOV CX,10000D CALL DEC_DIV MOV CX,1000D CALL DEC_DIV MOV CX,100D CALL DEC_DIV MOV CX,10D CALL DEC_DIV MOV CX,1D CALL DEC_DIV POPF POP DX POP CX POP BX POP AX RET DEC_DIV PROC NEAR MOV AX,BX MOV DX,0 DIV CX MOV BX,DX MOV DL,AL ADD DL,30H MOV AH,2 INT 21H RET DEC_DIV ENDP DISPDEC ENDP;*;*;用十进制输出BX中二进制的数方法二 DISPDECZ PROC NEAR PUSH AX PUSH BX 17/21 PUSH CX PUSH DX PUSHF MOV DX,OFFSET STRING302 MOV AH,9 INT 21H MOV AX,BX mov BX,0 dispdecz_re:MOV DX,0 MOV CX,10D DIV CX MOV XBX,DL INC BX cmp ax,0 JNE DISPDECZ_RE dispdecz_next:CMP BX,0 JE DISPDECZ_EXIT DEC BX MOV DL,XBX ADD DL,30H MOV AH,2 INT 21H JMP DISPDECZ_NEXT DISPDECZ_EXIT:POPF POP DX POP CX POP BX POP AX RET DISPDECZ ENDP;*;*;用十六进制输出BX中二进制数 DISPHEX PROC NEAR PUSH AX PUSH CX PUSH DX PUSHF MOV DX,OFFSET STRING4 MOV AH,9 18/21 INT 21H MOV CH,4 MOV CL,4 ROTATE:ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL PRINTIT ADD AL,7H PRINTIT:MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATE POPF POP DX POP CX POP AX RET DISPHEX ENDP;*;*;输出换行符 CRLF PROC NEAR PUSH AX PUSH DX MOV DL,0AH MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H POP DX POP AX RET CRLF ENDP;*;*;输出错误提示 19/21 ERROR PROC NEAR PUSH AX PUSH DX PUSHF CALL CRLF MOV DX,OFFSET STRING0 MOV AH,9 INT 21H CALL CRLF POPF POP DX POP AX RET ERROR ENDP;*;*CODE ENDS END START 4.1*DATA SEGMENT MONTH DB JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC NUM DB 2 DUP(?)STRONE DB month?,10,$STRTWO DB month ERROR!,10,$DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX BEGIN:MOV DX,OFFSET STRONE MOV AH,9 INT 21H MOV BX,0 MOV NUM,BL MOV NUM+1,BL RE:MOV AH,1 INT 21H 20/21 CMP AL,1BH JE EXIT CMP AL,0DH JE NEXT CMP AL,30H JB ERROR CMP AL,39H JA ERROR CMP BX,2 JZ ERROR MOV NUMBX,AL INC BX JMP RE NEXT:MOV AL,NUM SUB AL,30H JE ERROR MOV BL,NUM+1 CMP BL,0 JE GO SUB BL,30H MOV AH,10 MUL AH ADD AL,BL CMP AL,12 JA ERROR GO:MOV CX,3 DEC AL MOV AH,3 MUL AH MOV BX,OFFSET MONTH ADD BX,AX MOV DL,10 MOV AH,2 INT 21H OUTPUT:MOV DL,BX MOV AH,2 INT 21H INC BX LOOP OUTPUT MOV DL,0AH MOV AH,2 21/21 INT 21H JMP BEGIN ERROR:MOV DL,0AH MOV AH,2 INT 21H MOV DX,OFFSET STRTWO MOV AH,9 INT 21H JMP BEGIN EXIT:MOV AH,4CH INT 21H CODE ENDS END START 4.2*CODE SEGMENT ASSUME CS:CODE START:MOV bh,15 MOV BL,0FH REONE:MOV CX,16 RETWO:INC BL MOV AH,2 MOV DL,BL INT 21H MOV DL,0 INT 21H LOOP RETWO MOV AH,2 MOV DL,0AH INT 21H DEC bh JNZ REONE MOV AH,4CH INT 21H CODE ENDS END START