北邮汇编语言实验报告.docx

上传人:b****1 文档编号:1947760 上传时间:2023-05-02 格式:DOCX 页数:27 大小:57.73KB
下载 相关 举报
北邮汇编语言实验报告.docx_第1页
第1页 / 共27页
北邮汇编语言实验报告.docx_第2页
第2页 / 共27页
北邮汇编语言实验报告.docx_第3页
第3页 / 共27页
北邮汇编语言实验报告.docx_第4页
第4页 / 共27页
北邮汇编语言实验报告.docx_第5页
第5页 / 共27页
北邮汇编语言实验报告.docx_第6页
第6页 / 共27页
北邮汇编语言实验报告.docx_第7页
第7页 / 共27页
北邮汇编语言实验报告.docx_第8页
第8页 / 共27页
北邮汇编语言实验报告.docx_第9页
第9页 / 共27页
北邮汇编语言实验报告.docx_第10页
第10页 / 共27页
北邮汇编语言实验报告.docx_第11页
第11页 / 共27页
北邮汇编语言实验报告.docx_第12页
第12页 / 共27页
北邮汇编语言实验报告.docx_第13页
第13页 / 共27页
北邮汇编语言实验报告.docx_第14页
第14页 / 共27页
北邮汇编语言实验报告.docx_第15页
第15页 / 共27页
北邮汇编语言实验报告.docx_第16页
第16页 / 共27页
北邮汇编语言实验报告.docx_第17页
第17页 / 共27页
北邮汇编语言实验报告.docx_第18页
第18页 / 共27页
北邮汇编语言实验报告.docx_第19页
第19页 / 共27页
北邮汇编语言实验报告.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

北邮汇编语言实验报告.docx

《北邮汇编语言实验报告.docx》由会员分享,可在线阅读,更多相关《北邮汇编语言实验报告.docx(27页珍藏版)》请在冰点文库上搜索。

北邮汇编语言实验报告.docx

北邮汇编语言实验报告

微机原理汇编实验一

 

专业计算机科学与技术

班级

学生

学号

 

1、实验要求...................................................................3

2、实验设计...................................................................3

3、1.分析及算法思想...................................................................3

2.数据结构...............................................................................3

3.子程序...................................................................................4

4.流程图...................................................................................4

三、运行实例..................................................................6

四、实验总结..................................................................6

五、附页(源代码).......................................................7

一、实验要求:

一个学生的信息包括姓名、班级、学号(班内序号)、成绩。

试编写程序实现以下功能:

(1)能录入学生成绩(十进制形式);提示:

输入形如:

tom3011695回车,每名学生用一行,选择一个特殊符表示输入结束;

(2)能按要求:

如学号或成绩进行排序显示;

(3)能统计平均成绩;

(4)能统计不及格、60-70、70-80、80-90、90-100各分数段的人数。

2、实验设计:

1.分析及算法思想:

(1)采用数组进行数据存储:

学生数目信息数组(存储学生数目),学生信息数组(按班级-学号-姓名格式存储),平均成绩数组。

五个DB变量记录各分数段人数。

(2)输入学生数目保存在数组中,提示输入学生信息并存储,对于字符串输入进行转换,以二进制的形式存储在数据段中。

采用冒泡排序对数据段中的人员信息进行排序,以成绩为参数进行遍历,统计各分数段人数并将同时求出平均成绩,输出运算结果。

2.数据结构:

(1)输入:

a.学生数目数组numberdb3dup(0)

说明:

第一个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制)

b.学生信息数组informationdb99dup(20dup(0))

说明:

用20字节单元表示学生信息,0-19中:

0对应最大字符,1对应实际输入,2-18对应输入信息,19对应'$'

c.成绩数组gradedb99dup(7dup(0))

说明:

第一个存整数部分(二进制形式),第二个存小数部分(二进制形式)

d.平均成绩数组average_grade_bufferdb2dup(0)

说明:

和成绩数组原理一样

(2)排序:

(按成绩分布排序)

(3)提示信息:

Student_num:

提示输入学生数目

student_information:

提示输入学生信息

student_grade:

提示输入成绩信息

average_grade:

提示输出平均成绩

grade_rank:

提示输出成绩排名

Result1:

(90-100)分数段人数

Result2:

(80-90)分数段人数

Result3:

(70-80)分数段人数

Result4:

(60-70)分数段人数

Result5:

(0-60)分数段人数

blank:

输出空格,便于查看结果

huanhang:

输出换行,便于查看结果

3.子程序:

(1)store_student_num存储用户输入的学生数目;

(2)store_student_information存储学生姓名和班级和学号;

(3)store_student_grade存储学生成绩;

(4)sort排序学生成绩的函数;

(5)find_result显示最后结果的函数;

(6)display输出分数排序的函数。

(7)show将二进制数(不大于127的十进制整数)输出的函数

4.流程图:

3、运行实例:

输入四个学生的信息:

结果如下

4、实验总结

通过这次的汇编程序,我从中学习到了很多知识。

虽然刚开始的时候遇到了很多难题,但是通过与老师、同学的交流之后,逐步克服了一个个的难题。

提高了自己编程的思维能力,在将来的学习,生活之中能够快速的解决问题。

汇编相对于别的编程语言而言,难度是比较大。

汇编是直接对CUP进行操作,能够直接控制计算机编程。

由于汇编不像JAVA 那样的高级编程语言面向对象,在编程的时候思维有点乱,容易出错,而且小的错误也不容易找到,特别是程序代码长的时候。

5、附页(源代码)

;输入学生数目格式:

1到99的整数

;输入学生信息格式:

班级(class)-学号(NUM)—姓名(NAME),班级最多5位,学号最多5位,姓名最多6位,加上1位中间分隔符—

;输入学生成绩格式:

0.0-100.0最多一位小数

;

;!

!

!

警告:

任何错误的输入都将导致程序运行失败或错误!

!

!

;

;

;#######################################################数据段开始

DATASSEGMENT;此处输入数据段代码

;;;输入输出提示字符

student_numdb'Pleaseinputthenumberofstudents(1-99):

',0dh,0ah,'$'

student_informationdb0dh,0ah,'Pleaseinputthestudentinformation(CLASS-NUM-NAME):

',0dh,0ah,'$'

student_gradedb0dh,0ah,'Pleaseinputthestudentgrade(0.0-100.0):

',0dh,0ah,'$'

average_gradedb0dh,0ah,'Theaveragegradeis:

',0dh,0ah,'$'

result1db0dh,0ah,'Thenumberofstudentin[Up90]is:

',0dh,0ah,'$';各分数段人数

result2db0dh,0ah,'Thenumberofstudentin[80-90]is:

',0dh,0ah,'$'

result3db0dh,0ah,'Thenumberofstudentin[70-80]is:

',0dh,0ah,'$'

result4db0dh,0ah,'Thenumberofstudentin[60-70]is:

',0dh,0ah,'$'

result5db0dh,0ah,'Thenumberofstudentin[Below60]is:

',0dh,0ah,'$'

grade_rankdb0dh,0ah,'Thegraderank(fromhightolow)is:

',0dh,0ah,'$';打印排名

blankdb'','$'

huanhangdb0dh,0ah,'$'

kaishishuchudb0dh,0ah,'***********************************',0dh,0ah,'$'

;数据

numberdb3dup(0);第一个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制)

;用20字节单元表示学生信息,0-19中:

0对应最大字符,1对应实际输入,2-18对应输入信息,19对应'$'

informationdb99dup(20dup(0))

;用7字节单元来存分数,0-6中,0-4对应输入字符,5对应输入整数部分的二进制数,6对应于小数部分的二进制数

gradedb99dup(7dup(0))

average_grade_bufferdb2dup(0);第一个存整数部分(二进制形式),第二个存小数部分(二进制形式)

n0db0;各分数段人数存储区(二进制形式)

n1db0

n2db0

n3db0

n4db0

DATASENDS

CODESSEGMENT

ASSUMECS:

CODES,DS:

DATAS

START:

;此处输入代码段代码

MOVAX,DATAS

MOVDS,AX

movsi,0;指向每个学生信息

movdi,0;指向每个学生成绩

movcx,100;初始化学生数

movdx,offsetstudent_num;请求输入学生总数

movah,09

int21h

callstore_student_num;存储学生总数,结果送cx中

cmpcx,0;输入为0退出

jleOutToDOS

cmpcx,100;学生数超出本程序范围,退出

jgeOutToDOS

input:

movdx,offsetstudent_information;请求输入学生信息

movah,09

int21h

callstore_student_information;存储学生信息

addsi,20;指向下一个学生信息

movdx,offsetstudent_grade;请求输入学生成绩

movah,09

int21h

callstore_student_grade;存储每个学生成绩

adddi,7;指向下一个学生

loopinput;循环,直到输入所有学生成绩

callsort;排序

callfind_result;显示平均成绩和分段人数

calldisplay;显示排序结果

OutToDOS:

movah,1;任意键结束

int21h

movax,4c00h;返回DOS

int21h

;##########存储学生数目的函数

store_student_numproc;调用之后,cx中存储了学生数(二进制)

pushax

pushbx

movbx,0

s1:

movah,1

int21h

cmpal,0dh;是否为回车

jes2

andal,0fh;转换为非压缩的BCD码

movnumber[bx],al

incbx

jmps1

s2:

cmpbx,2

jgs5;大于2

jzs3;等于2

;小于2

moval,number

jmps4

s3:

movah,number

moval,number+1

aad;BCD码转换为二进制数

s4:

movnumber+2,al

movcx,0

movcl,number+2

s5:

popbx

popax

ret

store_student_numendp

;##########存储学生信息的函数

store_student_informationproc

pushax

pushbx

pushdx

moval,18

movinformation[si],al

leadx,information[si]

movah,0ah

int21h

movbl,information[si+1];实际输入的字符个数

moval,''

movinformation[si+bx+2],al;将回车换成''

movinformation[si+19],'$';将每个存储单元的最后一个字节置为'$'以便输出

popdx

popbx

popax

ret

store_student_informationendp

;##########存储学生成绩的函数

store_student_gradeproc

pushax

pushbx

pushcx

pushdx

movbx,0

movcx,0

movdx,di

deal0:

movah,1

int21h

cmpal,0dh;判断是否为回车

jzdeal2;是回车

cmpal,'.';是否为小数点

jnzdeal1;不是小数点

movbx,cx;bx指向小数点处

incbx;标记小数点字符出现在第几个位置

deal1:

pushbx

movbx,dx

movgrade[bx],al

popbx

inccx;记录输入字符的个数

incdx

jmpdeal0

deal2:

cmpbx,0

jnzdeal3;有小数点

;无小数点

cmpcx,3

jggout;大于100

jzdeal4;等于100

;小于100

cmpcx,2

jzdeal5;输入数目为2位数

;个位数

deal6:

;处理个位数

moval,grade[di]

subal,'0'

movgrade[di+5],al

jmpgout

deal5:

;处理2位数

movah,grade[di]

andah,0fh

moval,grade[di+1]

andal,0fh

aad

movgrade[di+5],al

jmpgout

deal4:

;处理3位数

moval,100

movgrade[di+5],al

jmpgout

deal3:

;处理带有小数部分的成绩

moval,grade[di+bx];将小数部分处理

subal,'0'

movgrade[di+6],al

cmpbx,4

jzdeal4;'.'出现在输入字符的第四位,则输入的整数部分为3位数

jggout;整数部分大于3位数

cmpbx,3

jzdeal5;'.'出现在输入字符的第三位,则输入的整数部分为2位数

jmpdeal6;否则为个位数

gout:

popdx

popcx

popbx

popax

ret

store_student_gradeendp

;##########排序学生成绩的函数

sortproc

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

movdx,0

movdl,number+2

Loop1:

;使用冒泡排序法

movcx,dx

movdi,0

movsi,0

Loop2:

;先比整数部分,再比小数部分

moval,grade[di+5]

cmpal,grade[di+12]

jgnext;大于,向下个移动

jlswap1;小于,交换成绩,名字

;等于,比较小数部分

moval,grade[di+6]

cmpal,grade[di+13]

jgenext;大于或等于,向下个移动

jlswap1;小于,交换成绩,名字

swap1:

movbx,si

swap11:

;交换学生信息

moval,information[bx+2]

xchgal,information[bx+22]

movinformation[bx+2],al

incbx

cmpal,'$'

jnzswap11

pushbx

movbx,0

swap2:

;交换学生成绩

moval,grade[di+bx]

xchgal,grade[di+bx+7]

movgrade[di+bx],al

incbx

cmpbx,7

jnzswap2

popbx

next:

addsi,20

adddi,7

deccx

jnzLoop2

decdx

jnzLoop1

popdi

popsi

popdx

popcx

popbx

popax

ret

sortendp

;##########显示最后结果的函数

find_resultproc

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

movbx,0

movcx,0

movcl,number+2;cl中保存学生人数

movdi,0

movsi,0

F1:

moval,grade[di+5]

cmpal,100

jgFout;大于100

jzF90;等于100

;小于100

cmpal,90

jgeF90;大于等于90

;小于90

cmpal,80

jgeF80;大于等于80

;小于80

cmpal,70

jgeF70;大于等于70

;小于70

cmpal,60

jgeF60;大于等于60

;小于60

;处理<60

movdl,n4

incdl

movn4,dl

Fnext:

;处理平均成绩处理方式:

整数部分*10+小数部分*10,结果先除以学生人数,再输出(输出整数时除以10)

moval,grade[di+5]

movdl,10

muldl

movdl,grade[di+6]

movdh,0

addax,dx

addbx,ax

jmpF2

F90:

;处理>=90

movdl,n0

incdl

movn0,dl

jmpFnext

F80:

;处理大于等于80小于90

movdl,n1

incdl

movn1,dl

jmpFnext

F70:

;处理大于等于70小于80

movdl,n2

incdl

movn2,dl

jmpFnext

F60:

;处理大于等于60小于70

movdl,n3

incdl

movn3,dl

jmpFnext

F2:

adddi,7

deccx

jnzF1;处理所有学生

movdx,offsetkaishishuchu;打印一段************

movah,09

int21h

movdx,offsetaverage_grade;打印平均成绩

movah,09

int21h

movax,bx

movdx,0

movcx,0

movcl,number+2

divcx

movcl,10

divcl

callshow;先打印平均成绩的整数部分

pushax

movdl,'.';打印'.'

movah,2

int21h

popax

moval,ah

callshow;再打印平均成绩的小数部分

movdx,offsetresult1;输出大于等于90的人数

movah,09

int21h

moval,n0

callshow

movdx,offsetresult2;输出大于等于80并小于90的人数

movah,09

int21h

moval,n1

callshow

movdx,offsetresult3;输出大于等于70并小于80的人数

movah,09

int21h

moval,n2

callshow

movdx,offsetresult4;输出大于等于60并小于70的人数

movah,09

int21h

moval,n3

callshow

movdx,offsetresult5;输出小于60的人数

movah,09

int21h

moval,n4

callshow

Fout:

popdi

popsi

popdx

popcx

popbx

popax

ret

find_resultendp

;##########输出分数排序的函数

displayproc

pushax

pushbx

pushcx

pushdx

pushsi

pushdi

movdx,offsetgrade_rank

movah,09

int21h

movcx,0

movcl,number+2;cl中保存学生人数

movdi,0

movsi,0

D1:

leadx,offsetinformation

adddx,si

adddx,2

movah,09

int21h

movdx,offsetblank;打印一段空白

movah,09

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2