汇编语言实验报告
- 格式:doc
- 大小:166.50 KB
- 文档页数:19
《汇编语言》
实验报告
班 级 软件132班
学 号 139074190
姓 名 吕自明
指导教师 陆勤
实验五:循环程序设计
一、 程序说明
第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。
第二个程序是用来判别键盘上输入的字符:若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,z则结束程序,若为其他字符则不显示,继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。1-9字符,则显示之。若是若小于0,则重新等待输入。若大于9,则跳转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’a’、’z’比较处,若小于a或大于z,则重新等待输入,否则输出‘c’。
二、 调试说明
调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm 集成实验环境 2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察程序是如何进行循环的。修改AL中的内容,可以通过-r指令来实现,如修改ax 中的内容,通过指令-r ax来实现,如下图所示:
从图中可看出,修改后,ax中的内容从开始的003E变为231A。
一、 源程序清单和执行结果
第一个程序的源程序:
CODES SEGMENT
ASSUME CS:CODES
START:
mov al,3eh
push ax
mov dl,al
mov cl,4
shr dl,cl
cmp dl,9
jbe next1
add dl,7
next1:add dl,30h
mov ah,2
int 21h
pop ax
mov dl,al
and dl,0fh
cmp dl,9
jbe next2
add dl,7
next2:add dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
CODES ENDS
END START
程序的最终运行结果如下所示:
第二个程序的源程序:
CODES SEGMENT
ASSUME CS:CODES
START:
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 START
charup:cmp al,41h
jb next
cmp al,5ah
ja chrdn
dispc:mov dl,'c'
mov ah,2
int 21h
next:jmp START
chrdn:cmp al,61h
jb next
jmp dispc
done:MOV AH,4CH
INT 21H
CODES ENDS
END START
程序的最终运行结果如下:
实验报告
系 班级 学号 姓名
同组者 指导教师
实验六:分支程序设计
一、 程序说明
第一个程序是用来显示AL寄存器中的两位十六进位制数,通过DOS功能调用INT21H的2号功能显示出来。
第二个程序是用来判别键盘上输入的字符:若是1-9字符,则显示之;若为A-Z或a-z字符,均显示“c”;若是回车字符,z则结束程序,若为其他字符则不显示,继续等待新的字符输入。首先输入一个字符,将其和回车字符比较,若是回车字符,则结束程序。1-9字符,则显示之。若是若小于0,则重新等待输入。若大于9,则跳转到和‘A’、Z’比较,若小于’A’,则重新等待输入,若大于’Z’,则跳转到和’a’、’z’比较处,若小于a或大于z,则重新等待输入,否则输出‘c’。
三、 调试说明
调试程序可以在debug中进行,基本步骤和前面的实验大致相同,在软件Masm
集成实验环境 2008.4中编辑程序,则可以直接点击程序上的调试按钮,即可进行调试。调试时可通过-t指令来逐步运行程序,观察程序是如何进行分支的。修改AL中的内容,可以通过-r指令来实现,如修改ax 中的内容,通过指令-r ax来实现,如下图所示:
从图中可看出,修改后,ax中的内容从开始的003E变为231A。
三、源程序清单和执行结果
第一个程序的源程序:
CODES SEGMENT
ASSUME CS:CODES
START:
mov al,3eh
push ax
mov dl,al
mov cl,4
shr dl,cl
cmp dl,9
jbe next1
add dl,7
next1:add dl,30h
mov ah,2
int 21h
pop ax
mov dl,al
and dl,0fh
cmp dl,9
jbe next2
add dl,7
next2:add dl,30h
mov ah,2
int 21h
mov ah,4ch
int 21h
CODES ENDS
END START
程序的最终运行结果如下所示:
第二程序的源程序为:
CODES SEGMENT
ASSUME CS:CODES
START:
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 START
charup:cmp al,41h
jb next
cmp al,5ah
ja chrdn
dispc:mov dl,'c'
mov ah,2
int 21h
next:jmp START
chrdn:cmp al,61h
jb next cmp al,7ah
ja next
jmp dispc
done:MOV AH,4CH
INT 21H
CODES ENDS
END START
程序的最终运行结果为:
实验七:统计不同成绩段学生的人数
一、 程序说明
本程序用来统计在不同分数段的学生人数并显示出来。有三个子程序,分别用来统计各分数段的学生人数、输出相关内容、换行回车。子程序一中,先将每个学生的分数从100、90、80、70、60逐个比较,在哪一分数段,则将其个数加一。直到所有分数都完成比较。子程序二则利用DOS功能调用INT21H的9号功能在显示器上显示一个字符串和2号功能在显示器上显示一个字符来实现输出相关内容。子程序三通过DOS功能调用INT21H的2号功能在显示器上显示一个字符实现换行和回车的。
二、调试说明
刚将程序设计出来的时候,我发现输出的结果并不是我想要的。而且我始终找不到错误,后来我在调试程序中用-t指令逐步调试,我发现了我的错误原因,原来没有回车换行的指令,在加入相关指令后,我的程序中还有一个错误,在每个数输出前没有指令将其加上30H,这样运行出来的结果是各种奇怪的字符,二不是我想要的结果。后来请教了其他同学才发现了这个问题。于是在每个分数段的学生人数输出之前需将其加上30H。这样整个程序就运行正常了。
在调试程序若没有换行指令,则运行结果只有最后一个低于六十分的人数,若没有回车指令,则运行结果很乱。之所以要在每个数输出前将其加上30H,是因为30H是0的ASCII码,只有加上30H之后,才得到需要输出数的ASCII码,这样输出的才是我想要的学生人数个数。
三、程序框图
程序的大致框图如下一页所示:
否
是
否 是
是
否
是
否
是
否
是
设置十个学生成绩
是否等于100
是否大于等于90
是否大于等于80
是否大于等于70
是否大于等于60 al加1,si减1
bh加1,si减1
bl加1,si减1
ch加1,si减1
cl加1,si减1 dl是否为0
退出程序