发布时间 : 星期六 文章东华大学微机实验报告答案(软件) (3000字)更新完毕开始阅读
int 21h
mov ax,4ch int 21h
;input程序段
;以学号为序从键盘输入一个班的学生成绩,各个成绩之间 用逗号格开,最后以回车符结束。
;然后把一个班的成绩存入grade数组。 input proc near lea dx,enter mov ah,9
int 21h ;提示用户输入 mov si,0
mov count,0 ;将输入用户的输入个数置0
_enter: ;对用户的输入进行监视,对错误输入立即进行出错处理call decibin ;调用decibin ;对用户输入进行处理 inccount
cmp dl,, ;与,比较,相同则保存成绩,不同出错je _store
cmp dl,0dh ;与回车键进行比较,回车则成绩输入结束je _endenter jne _error ;出错处理:显示出错信息 _store:;保存成绩 mov grade[si],bx add si,2 jmp _enter _error:
lea dx,error mov ah,9 int 21h
_endenter: ;用户结束成绩输入 mov grade[si],bx
mov dx,offset cr ;换行 mov ah,9 int 21h ret
input endp
;rankp程序段
;从grade数组取得一个班的成绩,以学号为序计算出该班每个学生的名次存入rank数组。;算法为:一个学生的名次等于成绩高于该生的学生人数加1 rankp proc near mov di,count mov bx,0 _loop:
mov ax,grade[bx] ;取学生成绩
mov word ptr rank[bx],0 ;初始化rank[bx]的值为0 mov cx,count lea si,grade ;第一个学生的成绩 _next1:
cmp ax,[si] ;比较两个成绩
jg _jump ;成绩大于被比较的跳过 incword ptr rank[bx] _jump:
add si,2 ;取下一个被比较成绩的地址 loop _next1 add bx,2 ; 下一个成绩
dec di ;未比较成绩个数减1 jne_loop ret
rankp endp
;output程序段
;从rank数组取得一个班的学生名次。把一个班的学生名次以学号为序在终端显示出来 ;调用子模块binidec,以便把rank数组中的二进制数转成十进制数并在终端上显示出来.调用子模块crlf完成回车,换行功能. output proc near lea dx,show mov ah,09h int21h
mov si,0 mov di,count _next2:
mov bx,rank[si] ;将成绩保存到bx中 call binidec ;调用binidec mov dl,,
mov ah,02hint21h ;显示,
add si,02h;取下一个成绩名次 dec di jnz _next2
mov dx,offset cr ;换行 mov ah,9 int 21h ret
output endp
;decibin程序段
;从键盘取得一个十进制数。把该数转换成二进制数并存入bx寄存器中。 decibin proc near mov bx,0 _catch:
mov ah,01h int21h
mov dl,al sub al,30h
jl _endchange ;小于则结束sfvof=1 cmp al,39h jg _endchange ;大于则结束 cbw
xchg ax,bx;ax与bx值交换 mov cx,10 mul cx;无符号数乘法指令,(ax)<----(al)*(cx) xchg ax,bx
add bx,ax ;(bx)<------(bx)+(ax) jmp _catch _endchange: ret
decibin endp
;binidec程序段
;把bx寄存器中的二进制数转换成10进制数,并在终端屏幕上显示出来。调用dec_div来作除法运算并显示字符。 binidec proc near push bx push cx push si
push di ;压栈 mov cx,10
call dec_div ;调用dec_div mov cx,1
call dec_div ;调用dec_div pop di pop si pop cx
pop bx ;出栈 ret
binidec endp
;dec_div程序段
;把bx中二进制数除以相应的十的幂,并在屏幕上显示一位商。余数保存在bx寄存器中。 dec_div proc near mov ax,bx mov dx,0 divcx
mov bx,dx mov dl,al add dl,30h mov ah,02h int 21h;显示 ret
dec_div endp code ends end start
运行结果:
1、 思考题:
(1)写出4位bcd码转二进制数的算法。 设ax寄存器中存放着4位bcd码 bcdto2 proc near push bx
push cx push dx
mov bx, ax;保存ax中的bcd码到bx mov ax, 0 ;结果单元清0
mov cx, 4 ;共处理4位bcd码 retry: push cx mov cl, 4
rol bx, cl ;最高1位bcd码移到bx中的低半字节 pop cx mul w10 ;累加和ax x 10 -> dx:ax push bx and bx, 000fh ;取出bx中的1位bcd码 add ax, bx ;累加到ax中 pop bx loop retry pop dx pop cx pop bx ret
bcdto2 endp
(2) 写出ax中进二制数转bcd码的算法。
w1000 dw 1000,100,10,1 ;十进制数千,百,十,个位权值 ;入口参数:ax=二进制数。出口参数:ax=压缩bcd码 ax2tobcd proc near
xor bx, bx ;bcd码暂存单元清0
mov si, offset w1000 ;权值首地址送si mov cx, 4 ;循环次数4 -> cx retry: push cx mov cl, 4 shl bx, cl
mov dx, 0 ;dx:ax组成被除数
div word ptr[si] ;除以权值,商,余数在ax,dx中 or bx, ax ;压缩bcd码 mov ax, dx ;余数送ax pop cx
add si, 2 ;地址加2,指向下一权值
loop retrymov ax, bx ;bcd码由bx -> ax ret ax2tobcd endp
实验九 综合程序设计
设有十个学生成绩分别是76,69,84,90,73,88,99,63,100和80分。试编制一个子程序,统计低于60分,60~69分,70~79分,80~89分,90~99分和100分的人数,并输出显示统计结果。 源程序: data segment
s1 db below 60:,$ s2 db 60~69: ,$