21,459
社区成员
发帖
与我相关
我的任务
分享
;提供一部分,供参考
;-----------------------------------------------------------
; 宏:显示一个串
;-----------------------------------------------------------
QUTST macro string ;
push dx
push ax
mov dx,offset string
mov ah,09h
int 21h
pop ax
pop dx
ENDM
;-----------------------------------------------------------
stack segment stack
db 256 dup(0)
stack ends
;-----------------------------------------------------------
DSEG SEGMENT
GRADE DB 76,68,54,80,45,92,63,58,94,85
CNT DB 10
STR1 DB 'Please input grade :$'
STR2 DB 0dh,0ah,'please input grade again:$'
MES1 DB 13,10,'YES$'
MES2 DB 13,10,'NO$'
RESULT DB ?
AVG DB ?
DSEG ENDS
;-----------------------------------------------------------
code segment
assume cs:code,ds:DSEG,es:DSEG,ss:stack
start:
;初始化段寄存器
mov ax,dseg
mov ds,ax
mov es,ax
;输入数
call input
;比较
call ask
;终止程序
mov ax,4c00h
int 21h
;-----------------------------------------------------------
; (2)子程序INPUT
; 功能:等待用户输入两位数成绩,若不是数字,
; 则调用QUTST显示STR2,并重新等待输入
; 入口参数:无
; 出口参数:BL=两位数成绩
;-----------------------------------------------------------
input proc
qutst STR1 ;显示串
xor bx,bx ;用来记以前已输入的值,初始值为0
input0:
mov ah,1 ;接收一个字符
int 21h
cmp al,0dh ;是回车符吗?
jz @@02 ;是就跳
cmp al,'0' ;
jb @@01
cmp al,'9'
jg @@01
;否则,转换
mov ah,0 ;ah清0
sub al,'0' ;由ASCII转换为原值
shl bx,1 ;初始值为0,第二次是上次ax*2
mov dx,bx ;将这个乘以2的值暂存dx中
mov cl,2 ;
shl bx,cl ;bx * 4 ,(初始为0,这一步是实现上一次的值乘以8)
add bx,dx ;初始0,(再与上一次的二倍相加,完成乘以10的任务)
add bx,ax ;bx初始为ax(再加上这一次)
jmp input0 ;接收下一个字符
@@01:
qutst STR2
jmp input0
@@02:
ret
input endp
;-----------------------------------------------------------
; (4)子程序ASK
; 功能:将学生成绩与用户输入的成绩比较,若相等,
; 显示QUTST MES1,否则显示QUTST MES2。
; 入口参数:BL=两位数成绩
; 出口参数:无
;-----------------------------------------------------------
ask proc
xor cx,cx
mov cl,CNT ;循环变量
mov di,offset GRADE ;取数组首地址
mov al,bl ;al = bl
cld
repne scasb
jne @@10
qutst MES1 ;相等
jmp @@99
@@10:
qutst MES2 ;不相等
@@99:
ret
ask endp
code ends
end start