|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本人新手,在编写输入数字比大小的程序时遇到了一些问题,希望知道答案的高手能帮我解答,感激不尽!
问题如下:1.为什么电脑会无视我设置光标的命令?
2.为什么在程序某处(代码中标明了)加int 10h中断会死循环(记得好像遇过,后来把它删了)
3.本来程序设计输入20个数字按回车或随意输入第21个跳至转换过程,但如果输入第21个数字则程序可以正常运行,但会跳过键盘输入直接结束(如果第21个按回车则正常),为什么会有这样的情况?
代码如下:
- assume ds:data,ss:stack,cs:code ;输入10名同学的成绩,输出按输入顺序的学生排名的程序
- data segment
- table db '0123456789'
- orig db 20 dup('0')
- mark db 10 dup(0)
- rank db 10 dup(0)
- sign db 'Press any key to exit!',0
- show db 'Please wait for several minites!Calculating.....'
- biao db 'Mark:Rank:'
- data ends
- stack segment
- db 20 dup(0)
- stack ends
- code segment
- start:mov ax,data ;准备工作
- mov ds,ax
- mov ax,stack
- mov ss,ax
- mov ax,0b800h
- mov es,ax
- mov bp,0 ;输入阶段以bp计数输入字数
- mov di,0
- mov si,0 ;以si计数,每输入2个字加一空格
-
- call cleanscreen
- mov cx,5
- mov bx,offset biaoprepa:mov byte ptr dl,[bx]
- mov byte ptr es:[di],dl
- mov byte ptr dl,[bx+5]
- mov byte ptr es:[di+160],dl
- inc bx
- add di,2
- loop prepa
- mov dl,5
- mov dh,0
- mov ah,2
- int 10h
-
- keyb:mov ax,0 ;读取键盘
- int 16h
- mov bx,offset orig ;将输入内容存入orig中
-
- input:add bx,bp ;以二者相加为偏移地址
- cmp ah,0eh ;判别回车与退格
- je backspace
- cmp ah,1ch
- je enter1
- cmp bp,19 ;只能输入小于21个数字
- ja showw ;数字满后自动进入转换阶段(ascii到数字)
- mov ah,3 ;读取以及设置光标位置
- int 10h
- inc dl
- mov ah,2
- int 10h
- mov ds:[bx],al ;显示并保存
- mov es:[di],al
- inc bp
- add di,2
- inc si ;si开始计数
- cmp si,2
- je space ;si满足2时加一空格
- jmp keyb
-
- space:mov byte ptr es:[di],' '
- add di,2 ;加空格
- mov si,0
- mov ah,3
- int 10h
- inc dl
- mov ah,2
- int 10h
- jmp keyb
- backspace:cmp bp,0 ;当未输入而按退格时对操作不予回应
- je start
- mov ah,3 ;设置光标
- int 10h
- dec dl
- mov ah,2
- int 10h
- dec bx
- mov byte ptr ds:[bx],0 ;清除内容
- sub di,2
- mov byte ptr es:[di],' '
- dec bp
- jmp keyb ;返回等待输入
- enter1:cmp bp,0 ;如未输入字符按回车则判退出
- je exit
-
- showw:mov cx,3 ;等待过程中的显示(无实际意义如果不看应该也不会有影响)
- push dx ;我曾想在这里在读取光标(虽然没必要,但试过会使程序陷入死循环,不断循环此段。请高手指导为什么会这样?)
- shows:mov bx,cx
- mov bp,offset show
- mov di,800
- mov cx,44
- mov dh,5
- mov dl,44
- mov ah,2
- int 10h
- show1:mov dl,ds:[bp]
- mov es:[di],dl
- inc bp
- add di,2
- loop show1
- call wait0
- call print
- call wait0
- call print
- call wait0
- call print
- call wait0
- call print
- call wait0
- mov cx,bx
- mov byte ptr es:[di-2],' '
- mov byte ptr es:[di-4],' '
- mov byte ptr es:[di-6],' '
- mov byte ptr es:[di-8],' '
- loop shows
- mov cx,80
- mov di,800
- cls: mov byte ptr es:[di],' '
- add di,2
- loop cls
- pop dx
- int 10h
- jmp turn
- wait0:mov cx,1200
- wait1:push cx
- mov cx,0aaaah
- wait2:mov ax,ax
- loop wait2
- pop cx
- loop wait1
- ret
- print:mov dl,ds:[bp]
- mov es:[di],dl
- inc bp
- add di,2
- mov ah,3
- int 10h
- inc dl
- mov ah,2
- int 10h
- ret
-
- turn: mov bp,offset orig ;开始转换
- mov cx,20 ;外层循环定位20个ascii码
- turn1:push cx
- mov bx,offset table
- mov cx,10
- turn2:mov dl,ds:[bp] ;内层循环定位10个数字
- cmp dl,ds:[bx] ;利用表转换
- je turn3
- inc bx
- loop turn2
- turn3:mov ds:[bp],bl
- inc bp
- pop cx
- loop turn1
-
- mov ax,0 ;将2个独立数字整合成一个数字
- mov bx,offset orig
- mov bp,offset mark
- mov cx,10
- mov dl,10
- decib:mov al,ds:[bx]
- mul dl ;将高位乘10再加低位
- add al,ds:[bx+1]
- mov ds:[bp],al
- inc bp
- add bx,2
- loop decib
-
- mov bx,0 ;用整合后的数字来比大小排名次
- mov cx,10
- mov bp,0 ;以bp来做rank的偏移地址
- compa:push cx
- mov cx,10
- mov si,0 ;以si作为比较时mark的偏移地址
- mov ax,0 ;以al计名次
- comp1:mov dl,mark[bx]
- cmp dl,mark[si]
- jb add1 ;发现分高于的则名次加1
- comp2:inc si
- loop comp1
- inc al
- mov rank[bp],al ;将结果存入rank中
- inc bx
- inc bp
- pop cx
- loop compa
- jmp output
-
- add1: inc al ;当有分数高于此分数是计数加1
- jmp comp2
-
- output:mov bp,offset rank ;将rank中内容转换后输出
- mov cx,10
- mov di,170
- div1: mov al,ds:[bp]
- mov ah,0
- mov bl,10
- div bl ;除以10将其转化为10进制
- jmp turnrank
- div2: mov es:[di],al
- mov es:[di+2],ah
- mov byte ptr es:[di+4],' '
- inc bp
- add di,6
- loop div1
-
- p:mov si,offset sign ;输出'Press any key to exit!'
- mov cx,0
- mov di,480
- sign1:mov cl,ds:[si]
- jcxz ex
- mov es:[di],cl
- inc si
- add di,2
- jmp sign1
-
- ex: mov dh,3
- mov dl,22
- mov ah,2
- int 16h ;问题:为什么电脑无视我设置光标位置的指令?
- mov ax,0 ;等待按键退出
- int 16h
-
- exit: mov ax,4c00h ;程序退出
- int 21h
- turnrank:mov bl,al ;转换为ascii码
- mov al,table[bx]
- mov bl,ah
- mov ah,table[bx]
- jmp div2 ;跳回原处
-
- cleanscreen:mov cx,2000 ;清屏
- mov al,' '
- mov ah,07h
- cld
- rep stosw
- mov di,0
- ret
- code ends
- end start
复制代码
|
|