汇编语言实验报告

  • 格式: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

退出程序