山东大学汇编语言上机实验——实验五.doc
- 文档编号:156813
- 上传时间:2022-10-04
- 格式:DOC
- 页数:29
- 大小:2.77MB
山东大学汇编语言上机实验——实验五.doc
《山东大学汇编语言上机实验——实验五.doc》由会员分享,可在线阅读,更多相关《山东大学汇编语言上机实验——实验五.doc(29页珍藏版)》请在冰豆网上搜索。
子程序设计
2.6显示学生名次表rank
编制一个程序,要求接受键盘输入的一个班的学生成绩,并存放于一个50字的grade数组中,其中grade+i保存学号为I+1的学生成绩。
然后根据grade中的学生成绩,把学生成绩依次填入50字的rank数组中,其中rank+i的内容是学号为i+1的学生的名次。
再按学号顺序把名次从终端上显示出来。
本题要做的主要工作和例2.2的内容是完全一样的,只是增加了由用户键入学生成绩及输出学生名次两个部分的内容,因此这三个部分可以用子程序结构来完成。
子程序结构划分的层次图如图2.17所示,可以看出,main为主要模块,其下一层的三个模块为程序的三大部分。
现将各模块说明如下:
1.模块名:
main为总模块
输入:
从键盘输入一个班的学生成绩
输出:
显示一个班的学生成绩
功能:
根据输入的学生成绩,计算并显示学生名次。
算法如下:
一个学生名次等于成绩高于该学生的人数+1.
2.模块名:
input
输入:
以学号为序型键盘输入一个班的学生成绩。
各个成绩之间用逗号隔开,最后以回车符号结束。
输出:
把一个班的学生成绩存入grade数组。
功能:
接受一个班的学生成绩。
调用子模块decibin把键盘输入的一个十进制数转换为二进制数。
调用子模块crlf完成回车,换行功能。
3.模块名:
rankp
输入:
从grade数组取得一个班的学生成绩。
输出:
以学号为序计算出该班每个学生的名次存入rank数组。
功能:
计算一个班的学生成绩。
算法为:
一个学生的名次等于成绩高于该生的学生人数加1.
4,。
模块名;output
输入:
把rank数组取得一个班的学生名次。
输出:
把一个班的学生名次以学号为序在总端上显示出来。
功能:
先是一个班的学生名次。
调用子模块decibin把键盘输入的一个十进制数转换为二进制数。
调用子模块crlf完成回车,换行功能。
5:
模块名:
decilin
输入:
从键盘输入一个十进制数。
输出:
把该数转换成二进制数并存入BX寄存器中。
功能:
从键盘输入一个十进制数转换成二进制数并存入BX寄存器中。
6.模块名:
crlf
输出:
向终端发出回车换行符。
功能:
完成一次回车换行操作。
7.模块名:
binidec
输入:
从BX寄存器取得一个二进制数。
输出:
在终端屏幕显示一个十进制数。
功能:
把BX寄存器中的二进制数转换为十进制数,并在终端显示出来。
调用子模块DCE_DIV用来作除法运算并显示字符。
8.模块名:
dec_div
输入:
从BX寄存器中的二进制数除以相应的十的幂,并在屏幕显示一位商。
余数保存在BX寄存器中。
有了以上的层次图及模块说明,对程序的全貌有了基本了解。
在图2.18中,我们给出了除rankp以外的其余各个子程序的程序框图。
Rankp的框图与图2.4相同。
图2.19是程序清单,图2.20是本例的运行情况。
;PROGRAMTITLEGOESHERE——Rank
;**************************************************************************
datareasegment
grade dw 50dup(?
)
rank dw 50dup(?
)
count dw ?
mess1 db 'Grade?
$'
mess2 db 13,10,'InputError!
',13,10,'$'
mess3 db 'Rank:
$'
datarea ends
;**************************************************************************
prognamsegment
;--------------------------------------------------------------------------
main proc far
assumecs:
prognam,ds:
datarea
start:
;setupstackforreturn
push ds
sub ax,ax
push ax
;setDSregistertocurrentdatasegment
mov ax,datarea
mov ds,ax
;MAINPARTOFPROGRAMGOESHERE
call input
call rankp
call output
ret
main endp
;--------------------------------------------------------------------------
input proc near
lea dx,mess1
mov ah,09
int 21h
;
mov si,0
mov count,0
enter:
call decibin
inc count
cmp dl,','
je store
cmp dl,13
je exit2
jne error
store:
mov grade[si],bx
add si,2
jmp enter
error:
lea dx,mess2
mov ah,09
int 21h
exit2:
mov grade[si],bx
call crlf
ret
input endp
;--------------------------------------------------------------------------
rankp proc near
mov di,count
mov bx,0
loop1:
mov ax,grade[bx]
mov wordptrrank[bx],0
mov cx,count
lea si,grade
next:
cmp ax,[si]
jg no_count
inc wordptrrank[bx]
no_count:
add si,2
loop next
add bx,2
dec di
jne loop1
ret
rankp endp
;--------------------------------------------------------------------------
output proc near
lea dx,mess3
mov ah,09
int 21h
;
mov si,0
mov di,count
next1:
mov bx,rank[si]
call binidec
mov dl,','
mov ah,02
int 21h
add si,2
dec di
jnz next1
call crlf
ret
output endp
;--------------------------------------------------------------------------
decibin proc near
;proceduretoconverdecimalonkeybdtobinary.
;resultisleftinBXregister.
mov bx,0
;getdigitfromkeyboard,converttobinary
newchar:
mov ah,1
int 21h
mov dl,al
sub al,30h
jl exit1
cmp al,9d
jg exit1
cbw
;(digitisnowinAX)
;multiplynumberinBXby10decimal.
xchg ax,bx
mov cx,10d
mul cx
xchg ax,bx
;adddigitinAXtonumberinBX
add bx,ax
jmp newchar
exit1:
ret
decibin endp
;--------------------------------------------------------------------------
binidec proc near
;proceduretoconvertbinarynumberinBXtodecimal
;onconsolescreen
push bx
push cx
push si
push di
mov cx,100d
call dec_div
mov cx,10d
call dec_div
mov cx,1d
call dec_div
pop di
pop si
pop cx
pop bx
ret
binidec endp
;--------------------------------------------------------------------------
dec_div proc near
;sub_subroutinetodividenumberinBXybnumberinCX
;printquotientonscreen
mov ax,bx
mov dx,0
div cx
mov bx,dx
mov dl,al
;printthecontentsofDLonscreen
add dl,30h
mov ah,02h
int 21h
ret
dec_div endp
;--------------------------------------------------------------------------
crlf proc near
;printcarriagereturnandlinefeed
mov dl,0ah
mov ah,02h
int 21h
;
mov dl,0dh
mov ah,02h
int 21h
;
ret
crlf endp
;--------------------------------------------------------------------------
prognamends
;**************************************************************************
end start
程序框图如下:
实验截图如下:
实验总结:
在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。
主程序和子程序之间嵌套使用,使得写代码时思路更清楚明白,读代码时方便快捷清晰明了。
这点跟高级编程语言类似。
而此程序中变量p可以跟踪并控制输入的人数、输名字要预留缓存区、十进制码要和二进制码间相互转换,这些又体现了编程低级语言的特点。
学习汇编语言,重要的事掌握如何通过汇编指令和程序来控制计算机各个组成部件工作,完成一系列任务。
因此,学习汇编用语言与学习高级语言的不同之处是要学习如何深入到计算机的内部进行控制。
通过这次实验,加深了我对汇编语言的理解。
每一步的输入、存储、转换、输出,都需要一
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 山东大学 汇编语言 上机 实验