1、汇编语言程序设计实验报告(二)班级:软093班 学号:099074217 姓名:江 涛指导老师:陆勤2011年11月实验一统计不同成绩段学生的人数1、 程序流程图:设置10个学生成绩是否等于1000是否不小于90是否不小于80是否不小于60是否不小于70Al加1Bh加1Bl加1Ch 加1Cl 加1Dh加1Dl是否为0运行结束2、 源代码:datas segment array db 67,69,84,90,73,88,99,63,100,80 string1 db The number of 100:$ string2 db The number of 90-99:$ string3 db T
2、he number of 80-89:$ string4 db The number of 70-79:$ string5 db The number of 60-69:$ string6 db the number of low 60:$datas endsstacks segmentstacks endscodes segment assume cs:codes,ds:datas,ss:stacksstart: mov ax,datas mov ds,ax mov al,0 ;用于计数 mov bx,0 mov cx,0 mov dh,0 mov dl,10 ;循环次数 call coun
3、t call output mov ah,4ch int 21hcount proc near ;子程序一,用来统计各分数段的人数 mov si,0next: cmp arraysi,100 ;将分数与100比较 jz L1 jl next1 next1: cmp arraysi,90 ;与90比较 jae L2 jl next2 next2: cmp arraysi,80 ;与80比较 jae L3 jl next3 next3: cmp arraysi,70 ;与70比较 jae L4 jl next4 next4: cmp arraysi,60 ;与60比较 jae L5 inc dh
4、inc si dec dl ;循环次数减1 jnz next ;若dl尚未减少到零则回到next处执行 jmp exit ;若为零就转到exit处执行,退出L1: inc al ;对分数为100的学生的人进行计数 inc si dec dl jnz next jmp exitL2: inc bh ;对分数在90-99的学生的人进行计数 inc si dec dl jnz next jmp exitL3: inc bl ;对分数在80-89的学生的人进行计数 inc si dec dl jnz next jmp exitL4: inc ch ;对分数在70-79的学生的人进行计数 inc si
5、dec dl jnz next jmp exitL5: inc cl ;对分数在60-69的学生的人进行计数 inc si dec dl jnz nextexit: ret count endp output proc near ;子程序二,用来输出相关内容 mov ah,0 push dx push cx push bx push ax lea dx,string1 ;输出100分的人数 mov ah,9 int 21H pop bx mov dl,bl add dl,30h mov ah,2 int 21H call enter lea dx,string2 ;输出90至99分的人数 mo
6、v ah,9 int 21H pop bx mov dl,bh add dl,30h mov ah,2 int 21H call enter lea dx,string3 ;输出80至89分的人数 mov ah,9 int 21H mov dl,bl add dl,30h mov ah,2 int 21H call enter lea dx,string4 ;输出70至79分的人数 mov ah,9 int 21H pop bx mov dl,bh add dl,30h mov ah,2 int 21H call enter lea dx,string5 ;输出60至69分的人数 mov ah
7、,9 int 21H mov dl,bl add dl,30h mov ah,2 int 21H call enter lea dx,string6 ;输出低于60分的人数 mov ah,9 int 21H pop bx mov dl,bh add dl,30h mov ah,2 int 21H call enter retoutput endpenter proc near ;子程序三,用来在每行输出后回车换行 mov dl,0ah mov ah,02h int 21h mov dl,0dh mov ah,02h int 21h retenter endpcodes endsend star
8、t3、 调试: 补充实验一编制一个程序,要求在键盘上接收一个4位的16进制数,并在屏幕上显示与它等值的二进制数1、 源代码:data segment string1 db please input:$ ;提示输入 string2 db 16 dup(?),$data endscode segment assume cs:code,ds:datamain proc farstart: mov ax,data mov ds,ax lea di,string2 xor bx,bx mov ch,4 lea dx,string1 mov ah,9 int 21hl1: mov ah,1 int 21h
9、 cmp al,0 ;小于0的ascii跳到l1 jb l1 cmp al,9 ;不小于9的ascii跳到l3 jbe l3 cmp al,A ;小于A的ascii跳到l1 jb l1 cmp al,F ;不小于F的ascii跳到l2 jbe l2 cmp al,a ;小于a的ascii跳到l1 jb l1 cmp al,f ;大于f的ascii跳到l1 ja l1 sub al,20h ;字母转换为表示的十进制数l2: sub al,37h jmp l4l3: ;16进制数转换为2进制数 and al,0fhl4: ;转换得到的2进制数存入寄存器bx中 mov cl,4 shl bx,cl
10、add bl,al dec ch jnz l1 mov cx,16l5: ;输出得到的2进制数 xor dl,dl rol bx,1 rcl dl,1 add dl,30h mov di,dl inc di loop l5 mov dl,0dh ;回车换行 mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h lea dx,string2 mov ah,9 int 21h mov ah,4ch int 21hmain endpcode ends end start2、 调试: 补充实验二从键盘输入一系列字符串(以回车符结束),按字母、数字和其他字符分类计数,
11、最后显示出这三类的计数结果1、 源代码:data segment string0 db please input:$ ;输入提示 string1 db the number of letter:,$ string2 db the number of num:,$ string3 db the number of others:,$data endscode segment assume cs:code,ds:datamain proc farstart: mov ax,data mov ds,ax lea dx,string0 mov ah,9 int 21h xor cx,cx xor bl
12、,bll0: ;数字字符计数 mov ah,1 int 21h cmp al,0dh jz l4 cmp al,0 jb l3 cmp al,9 ja l1 inc ch jmp l0l1: ;大写字母计数 cmp al,A jb l3 cmp al,Z ja l2 inc cl jmp l0l2: ;小写字母计数 cmp al,a jb l3 cmp al,z ja l3 inc cl jmp l0l3: ;其它字符计数 inc bl jmp l0l4: lea dx,string1 ;输出字母个数 mov ah,9 int 21h mov dl,cl or dl,30h mov ah,2
13、int 21h mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h lea dx,string2 ;输出数字个数 mov ah,9 int 21h mov dl,ch or dl,30h mov ah,2 int 21h mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h lea dx,string3 ;输出其它字符个数 mov ah,9 int 21h mov dl,bl or dl,30h mov ah,2 int 21h mov dl,0dh mov ah,2 int
14、21h mov dl,0ah mov ah,2 int 21h mov ah,4ch int 21hmain endpcode ends end start2、 调试: 补充实验三根据键盘输入的字符AE(或ae),分别显示ONE、TWO、THREE、FOUR、FIVE,当输入其他字符时,显示ERROR,然后重新输入1、 源代码:data segment string0 db please input:$ ;提示输入 mess db 0ah,0dh,ONE ,$ db 0ah,0dh,TWO ,$ db 0ah,0dh,THREE,$ db 0ah,0dh,FOUR ,$ db 0ah,0dh,
15、FIVE ,$ err db 0ah,0dh,Error,0ah,0dh,$data endscode segment assume cs:code,ds:datamain proc farstart: mov ax,data mov ds,ax lea dx,string0 mov ah,9 int 21h mov ah,1 ;输入字母 int 21h cmp al,A ;输入字母ascii值小于A的报错 jb error cmp al,E ja compare ;输入字母ascii值大于E的跳的compare处 sub al,65 ;输入的是小写字母a-e jmp print compare: cmp al,a ;输入字母ascii值小于a的报错 jb error cmp al,e ;输入字母ascii值大于e的报错 ja error sub al,97 jmp printerror: lea dx,err mov ah,9 int 21h jmp startprint: ;输出 mov bl,8 mul bl and ax,0ffh lea dx,mess add dx,ax mov ah,09h int 21h mov ah,4ch int 21hmain endpcode ends end start2、 调试: