1、最新版汇编实验报告88112359汇编实验报告 姓名:管仕敏 班级:软件124 学号: 指导老师:陆勤实验一 汇编运行环境及方法、简单程序设计1. 程序说明: 本程序用来比较两个字符串string1和string2所含的字符是否相同。若相同则显示Match,否则显示Nomatch。 在程序的数据段先定义两个字符串string1和string2,再定义两个字符串mess1和mess2,分别代表Match和Nomatch。再代码段比较字符串string1和string2,通过比较判断是否相同。若相同则显示Match,否则显示Nomatch。2.程序代码(比较两字符串):datarea segmen
2、t string1 db Move the cursor backward. string2 db Move the ecursor backward. mess1 db Match.$ mess2 db No match!$datarea endsprognam segment main proc far assume cs:prognam,ds:datarea,es:datarea start: push ds sub ax,ax push ax mov ax,datarea mov ds,ax mov es,ax lea si,string1 lea di,string2 cld mov
3、 cx,25 repz cmpsb jz match lea dx,mess2 jmp short disp match: lea dx,mess1 disp: mov ah,09 int 21h ret main endp prognam ends end start3.截图:该程序是用来判断两字符串string1和string2是否相同,相同则显示match。实验二 用DEBUG编程:使用堆栈段将AX和BX的内容进行交换等1.程序说明:(1)设堆栈指针SP=2000H,AX=3000H,BX=5000H;编一程序段将AX和BX的内容进行交换。请用堆栈作为两寄存器交换内容的中间存储单元,用D
4、EBUG调试程序进行汇编与调试。(2)设DS=当前段地址,BX=0300H,SI=0002H;请用DEBUG的命令将存储器偏移地址300H304H连续单元顺序装入0AH,0BH,0CH,0DH,0EH。在DEBUG状态下送入下面程序,并用单步执行的方法,分析每条指令源地址的形成过程,当数据传送完毕时,AX中的内容是什么。2.程序代码:MOV AX,BXMOV AX,0304HMOV AX,0304HMOV AX,BXMOV AX,0001BXMOV AX,BXSIMOV AX,0001BXSIHLT3.截图:先使用-r 设置sp,ax,bx,在使用-a输入指令然后再-t单步调试刚开始ax 30
5、00,bx 5000 debug调试后 ax,5000 bx 3000 首先用-r设置bx,si 然后再用-e将a,b,c,d,e分配到指定的内存中,-a输入指令最后-t单步调试执行单步调试后ax的值一直变化从000E,0B0A,0C0B,0D0C,0E0D实验三 存储器块清零和内存块移动1. 程序说明:第一个程序是存储块清零。程序流程大概为首先设置起始地址,然后设置块长度,然后将当前地址内容清零,地址加1,然后查看是否清除完全,若没有则回到当前地址清零,然后再查看,直到地址内容清除完,结束程序。第二个程序是内存块移动。程序流程框图为:首先设置块的源地址,然后设置筷的目的地址,然后再设置移动长
6、度,然后按长度重复传送数据,然后结束。2调试及截图: 第一个程序进入debug先用-u指令查看程序代码然后-d查看内存的情况再执行-g讲程序执行完 在用-d查看内存 第二个程序进入debug后先用-u查看程序 然后-g运行到指令rep movsd 之前再用 d查看内存的内容-g前-g后实验四 将键盘输入的小写字母用大写字母显示出来1.程序说明:本程序用来将小写字母转变为大写,并在屏幕上显示出来。先利用DOS功能调用INT21H的1号功能从键盘输入字符,然后判断输入的是否是小写字母,若不是小写字母,则显示输入出错,重新输入。若输入的是小写字母,则通过将其减去20h,从而变为大写字母。在通过DOS
7、功能调用INT21H的2号功能显示出来。若输入的是Enter键,则结束程序。2.程序代码:TITLE SHIYANCODE SEGMENT ASSUME CS:CODE START: MOV AH,01H INT 21H CMP AL,61H JL START SUB AL,20H MOV DL,AL MOV AH,02H INT 21H CODE ENDSEND START3.截图:实验五 循环程序设计1.程序说明:第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。第二个程序是用来判别键盘上输入的字符:若是1-9字符,则显示之;若为A-Z或
8、a-z字符,均显示“c”;若是回车字符,z则结束程序,若为其他字符则不显示,继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。1-9字符,则显示之。若是若小于0,则重新等待输入。若大于9,则跳转到和A、Z比较,若小于A,则重新等待输入,若大于Z,则跳转到和a、z比较处,若小于a或大于z,则重新等待输入,否则输出c。2.程序代码:CODE SEGMENTASSUME CS:CODESTART:MOV AL,3EHPUSH AXMOV DL,ALMOV CL,4SHR DL,CLCMP DL,9JBE NEXT1ADD DL,7NEXT1:ADD DL,30HM
9、OV AH,2INT 21HPOP AXMOV DL,ALAND DL,0FHCMP DL,9JBE NEXT2ADD DL,7NEXT2:ADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START3.截图:4.程序代码:code segment assume cs:codestart:mov ah,1 int 21h cmp al,0dh jz done cmp al,0 jb next cmp al,9 ja charup mov dl,al mov ah,2 int 21h jmp startcharup:cmp al,41h
10、 jb next cmp al,5ah ja chrdndispc:mov dl,c mov ah,2 int 21hnext:jmp startchrdn:cmp al,61h jb next cmp al,7ah ja next jmp dispcdone:mov ah,4ch int 21hcode ends end start5.截图:实验六 分支程序设计1.程序说明:第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。第二个程序是用来判别键盘上输入的字符:若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,z
11、则结束程序,若为其他字符则不显示,继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。1-9字符,则显示之。若是若小于0,则重新等待输入。若大于9,则跳转到和A、Z比较,若小于A,则重新等待输入,若大于Z,则跳转到和a、z比较处,若小于a或大于z,则重新等待输入,否则输出c2.程序代码:CODE SEGMENTASSUME CS:CODESTART:MOV AL,3EHPUSH AXMOV DL,ALMOV CL,4SHR DL,CLCMP DL,9JBE NEXT1ADD DL,7NEXT1:ADD DL,30HMOV AH,2INT 21HPOP AXMO
12、V DL,ALAND DL,0FHCMP DL,9JBE NEXT2ADD DL,7NEXT2:ADD DL,30HMOV AH,2INT 21HMOV AH,4CHINT 21HCODE ENDSEND START3.截图:可以对ax的值进行修改为00ad4.程序代码code segment assume cs:codestart:mov ah,1 int 21h cmp al,0dh jz done cmp al,0 jb next cmp al,9 ja charup mov dl,al mov ah,2 int 21h jmp startcharup:cmp al,41h jb nex
13、t cmp al,5ah ja chrdndispc:mov dl,c mov ah,2 int 21hnext:jmp startchrdn:cmp al,61h jb next cmp al,7ah ja next jmp dispcdone:mov ah,4ch int 21hcode ends end start5.截图:实验七 统计不同成绩段学生的人数1.程序说明:本程序用来统计在不同分数段的学生人数并显示出来。有三个子程序,分别用来统计各分数段的学生人数、输出相关内容、换行回车。子程序一中,先将每个学生的分数从100、90、80、70、60逐个比较,在哪一分数段,则将其个数加一。直
14、到所有分数都完成比较。子程序二则利用DOS功能调用INT21H的9号功能在显示器上显示一个字符串和2号功能在显示器上显示一个字符来实现输出相关内容。子程序三通过DOS功能调用INT21H的2号功能在显示器上显示一个字符实现换行和回车的。2.程序框图:3.程序代码:data segment grade db 63,100 a db 60renshu,$ b db 0ah,0dh,6070renshu:,$ c db 0ah,0dh,7080renshu:,$ d db 0ah,0dh,8090renshu:,$ e db 0ah,0dh,90100renshu:,$ f db 0ah,0dh,1
15、00renshu:,$ count db 10data endsstacks segmentstacks endscode segment assume cs:code,ds:data,ss:stacksmain proc farstart: mov ax,data mov ds,ax xor ax,ax xor bx,bx xor cx,cx xor dh,dh call countgrade call output mov ah,4ch int 21hmain endpcountgrade proc near mov di,0 io: cmp gradedi,60 jb l1 cmp gr
16、adedi,70 jb l2 cmp gradedi,80 jb l3 cmp gradedi,90 jb l4 cmp gradedi,100 jb l5 inc al jmp continuel1: inc bh jmp continuel2: inc bl jmp continuel3: inc ch jmp continuel4: inc cl jmp continuel5: inc dh jmp continuecontinue: inc di dec count jnz io retcountgrade endpoutput proc near mov ah,0 push ax p
17、ush dx push cx push bx lea dx,a ;分数小于60的人数 mov ah,9 int 21h pop bx mov dl,bh add dl,30h mov ah,2 int 21h lea dx,b ;分数60至69的人数 mov ah,9 int 21h mov dl,bl add dl,30h mov ah,2 int 21h lea dx,c ;分数70至79的人数 mov ah,9 int 21h pop bx mov dl,bh add dl,30h mov ah,2 int 21h lea dx,d ;分数80至89的人数 mov ah,9 int 21
18、h mov dl,bl add dl,30h mov ah,2 int 21h lea dx,e ;分数90至99的人数 mov ah,9 int 21h pop bx mov dl,bh add dl,30h mov ah,2 int 21h lea dx,f ;分数100的人数 mov ah,9 int 21h pop bx mov dl,bl add dl,30h mov ah,2 int 21h retoutput endpcode ends end start4.截图:附加实验:练习题3.编写程序,将DATA_NUM起的一个压缩BCD码转换成十六进制数,并存放在DATA_NUM下面的
19、相邻字节中。 DATA SEGMENT DATA_NUM DB 59h DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET DATA_NUM XOR AX,AX MOV AL,BX ;将原数保存到AL中 MOV CL,10H MOV CH,0AH DIV CL ;除16,商为AL,余数为AH MOV DL,AH XOR AH,AH ;将AH保存到DL,并清零AH MUL CH ADD AL,DL ;将AL乘10,再加上个位 MOV DATA_NUM+1,AL MOV A
20、H,4CH INT 21H CODE ENDS END START 结果如下图:4.试着编写一程序,用查表法将一位十六进制数转换成与之对应的ASCII码,程序的数据段如下:DATA SEGMENTTAB DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,39H,41H,42H,43H,44H,45H,46HHEX DB 6 ;0BHASC DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV BX,OFFSET TAB XOR AH,AH MOV AL
21、,HEX ;DEC AL ADD BX,AX MOV AL,BX ;查表得到结果保存到AL MOV ASC,AL MOV AH,4CH INT 21H CODE ENDS END START结果如下图:查找到6的ASCII码为36,保存到AX以及ASC中。5.试编程求解表达式S=(2300-(X*Y+Z)/Z,其中X=600,Y=25,Z=-2000.data segmentX dw 600Y dw 25Z dw -2000S dw ? ;S=(2300-(X*Y+Z)/Zdata endscode segment assume cs:code,ds:data start: mov ax,da
22、ta mov ds,ax ;初始化ds mov ax,X mul Y ;ax-X*Y add ax,Z ;ax-X*Y+Z mov bx,23000d sub bx,ax ;bx (X*Y+Z) mov ax,bx idiv Z ;ax=(23000-(X*Y+Z)/Z mov S,ax mov ah,4ch int 21h code ends end start结果如下图:最终结果ax=-5(FFFB),保存到S中补充实验:1.试编制一程序,要求从键盘上接收一个4位的16进制数,并在屏幕上显示与它等值的二进制数。源程序代码如下:data segment CR db 0ah,0dh,$data
23、 endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax xor bx,bx mov ch,4lab1: ;循环输入四次,字符放在AL中 mov ah,1 int 21h cmp al,0 jb lab1 cmp ah,9 jbe lab3 ;小于等于9,直接取出 cmp al,A jb lab1 cmp al,F jbe lab22 cmp al,a jb lab1 cmp al,f ja lab1lab2: sub al,20hlab22: sub al,37h ;转换为10-15 jmp lab4lab3:
24、;取al低四位,正好为一位十六进制数 and al,0fh lab4: mov cl,4 shl bx,cl add bl,al ;将低四位移到高位,加上低四位 dec ch jnz lab1 ;循环输入 lea dx,CR ;换行 mov ah,9 int 21h mov cx,16lab5: xor dl,dl rol bx,1 ;循环左移,将高位放入cf rcl dl,1 ;带进位循环左移,取cf到dl中 add dl,30h ;转换为0或1的ASCII码 mov ah,2 int 21h loop lab5 mov ah,4ch int 21h code ends end start程
25、序运行结果如下:2.从键盘上输入一系列字符串(以回车符结束),按字母、数字和其他字符分类计数,最后显示这三类的计数结果。源程序代码如下:(只能输出小于10的个数)data segment a db 0ah,0dh,zimugeshu:$ b db 0ah,0dh,shuzigeshu:$ c db 0ah,0dh,qitazifugeshu:$data endscode segment assume cs:code,ds:datastart: sub ax,ax push ax mov ax,data mov ds,ax sub cx,cx sub bl,bllab0: mov ah,1 in
26、t 21h cmp al,0dh jz lab4 ;输入回车结束,否则循环输入 cmp al,0 jb lab3 cmp al,9 ja lab1 inc ch ;数字计数 jmp lab0lab1: cmp al,A jb lab3 cmp al,Z ja lab2 inc cl ;字母计数 jmp lab0lab2: cmp al,a jb lab3 cmp al,z ja lab3 inc cl ;字母计数 jmp lab0lab3: inc bl ;其他字符计数 jmp lab0lab4: lea dx,a ;输出字母个数 mov ah,9 int 21h mov dl,cl or d
27、l,30h ;转换为数的ASCII码显示 mov ah,2 int 21h lea dx,b ;输出数字个数 mov ah,9 int 21h mov dl,ch or dl,30h mov ah,2 int 21h lea dx,c ;输出其他字符个数 mov ah,9 int 21h mov dl,bl or dl,30h mov ah,2 int 21hcode ends end start3.根据键盘输入的字符A-E(或a-e),分别显示ONE,TWO,THREE,FOUR,FIVE,当输入其他字符时,显示ERROR,然后重新输入。程序源代码如下:data segment messag
28、e db 0ah,0dh,ONE ,$ db 0ah,0dh,TWO ,$ db 0ah,0dh,THREE,$ db 0ah,0dh,FOUR ,$ db 0ah,0dh,FIVE ,$ error db 0ah,0dh,ERROR,0ah,0dh,$data endscode segment assume cs:code,ds:datastart: mov ax,data mov ds,ax mov ah,1 int 21h ;输入字符 cmp al,A jb err cmp al,E ja upchar sub al,65 jmp dispupchar: cmp al,a jb err cmp al,e ja err sub al,97 ;转换为对应的数字0-4 jmp disperr: lea dx,error mov ah,9 int 21h jmp start ;错误字符,重新输入disp: mov bx,8 mul b
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1