这篇文章还没写完,因为这个程序没看懂还。。。
例:从键盘输入10个数,分别统计0~9、10~99、100~数的个数,并在显示器上显示。
问题分析:
1.输入:从键盘输入一个数,并转换成二进制形式;
2.统计;
3.重复 1.2. 10次;
4.显示结果。
数据定义:
message db 'input data please:',0dh,0ah,'$' //0d 0a 一个是回车 一个是换行,回车将光标切换到行首,换行就是换行
message2 db 'output:',0dh,0ah,'$'
maxlen db 6 ;此处输入数据段代码
db 0
db 6 dup(9)
display db ' 0~ 9:',?,?,0dh,0ah
db '10~99:',?,?,0dh,0ah
db '100~ :',?,?
cr db 0dh,0ah,'$'//其实我也不知道这句话在干嘛 ,明天问一下老师吧。。。
count0 db 0
count1 db 0
count2 db 0
;输入并统计
mov cx,10
lea dx,message ;把message的地扔到dx寄存器里
mov ah,9
int 21h //这是一个固定搭配,让显示器显示以下。
next: call read_exch ;输入一个数据,结果在dx中,调用子程序了!
cmp dx,10 比较
jae g_10 如果大就去另外一个子程序
inc count0 ;//比10小就把这个计数器加一
jmp a_num_end
g_10: cmp dx,100
jae g_100
inc count1 ;10~99
jmp a_num_end
g_100:inc count2 ;100~
a_num_end:
loop next
;显示结果
lea dx,message2
mov ah,9
int 21h
mov bx,offset display //问题来了,这个是什么鬼
mov al,count0
call exch_to_asc10
mov [bx+6],ah
mov [bx+7],al
mov al,count1
call exch_to_asc10
mov [bx+16],ah
mov [bx+17],al
mov al,count2
call exch_to_asc10
mov [bx+26],ah
mov [bx+27],al
mov dx,bx
mov ah,9
int 21h //显示这个我完全没看懂。。。
read_exch procnear
push cx
mov dx,offset maxlen
mov ah,0ah
int 21h
lea dx,cr
mov ah,9
int 21h
mov ax,0
mov cl,maxlen+1
mov bx,offset maxlen
add bx,2
again: mov dh,0
mov dl,[bx]
and dl,0fh
mov ch,10
mul ch
add ax,dx
inc bx
dec cl
jnz again
mov dx,ax
pop cx
ret
read_exch endp
exch_to_asc10 proc near
mov ah,0
mov dl,10
div dl
or ax,3030h
xchg ah,al
ret
exch_to_asc10 endp
exch_to_asc proc near
push ax
mov cl,4
shr al,cl
or al,30h
cmp al,39h
jbe is_data_h
add al,7
is_data_h:
mov dh,al
pop ax
and al,0fh
or al,30h
cmp al,39h
jbe is_DATA_L
ADD al,7
is_data_l:
mov ah,dl
ret
exch_to_asc endp
网友评论