鱼C论坛

 找回密码
 立即注册
查看: 2324|回复: 1

求助:为什么电脑会无视我设置光标的命令

[复制链接]
发表于 2012-8-26 18:54:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本人新手,在编写输入数字比大小的程序时遇到了一些问题,希望知道答案的高手能帮我解答,感激不尽!
问题如下:1.为什么电脑会无视我设置光标的命令?
                 2.为什么在程序某处(代码中标明了)加int 10h中断会死循环(记得好像遇过,后来把它删了)
                 3.本来程序设计输入20个数字按回车或随意输入第21个跳至转换过程,但如果输入第21个数字则程序可以正常运行,但会跳过键盘输入直接结束(如果第21个按回车则正常),为什么会有这样的情况?
代码如下:
  1. assume ds:data,ss:stack,cs:code   ;输入10名同学的成绩,输出按输入顺序的学生排名的程序
  2. data segment
  3. table db '0123456789'
  4. orig db 20 dup('0')
  5. mark db 10 dup(0)
  6. rank db 10 dup(0)
  7. sign db 'Press any key to exit!',0
  8. show db 'Please wait for several minites!Calculating.....'
  9. biao db 'Mark:Rank:'
  10. data ends
  11. stack segment
  12.      db 20 dup(0)
  13. stack ends
  14. code segment
  15. start:mov ax,data                 ;准备工作
  16.       mov ds,ax
  17.               mov ax,stack
  18.               mov ss,ax
  19.               mov ax,0b800h
  20.               mov es,ax
  21.               mov bp,0                    ;输入阶段以bp计数输入字数
  22.               mov di,0                    
  23.               mov si,0                         ;以si计数,每输入2个字加一空格
  24.           
  25.       call cleanscreen
  26.               mov cx,5
  27.               mov bx,offset biaoprepa:mov byte ptr dl,[bx]
  28.       mov byte ptr es:[di],dl
  29.       mov byte ptr dl,[bx+5]
  30.               mov byte ptr es:[di+160],dl
  31.               inc bx
  32.       add di,2
  33.       loop prepa
  34.       mov dl,5
  35.               mov dh,0
  36.       mov ah,2
  37.       int 10h           
  38.           
  39. keyb:mov ax,0                    ;读取键盘
  40.                 int 16h
  41.                 mov bx,offset orig          ;将输入内容存入orig中
  42.                     
  43. input:add bx,bp                   ;以二者相加为偏移地址
  44.                  cmp ah,0eh                  ;判别回车与退格
  45.           je backspace
  46.                  cmp ah,1ch
  47.                   je enter1
  48.                  cmp bp,19                   ;只能输入小于21个数字
  49.           ja showw                    ;数字满后自动进入转换阶段(ascii到数字)
  50.                  mov ah,3                    ;读取以及设置光标位置
  51.                   int 10h
  52.                   inc dl
  53.                  mov ah,2
  54.                   int 10h
  55.                  mov ds:[bx],al              ;显示并保存
  56.                  mov es:[di],al
  57.                   inc bp
  58.                  add di,2
  59.           inc si                      ;si开始计数
  60.                  cmp si,2
  61.                   je space                    ;si满足2时加一空格
  62.                   jmp keyb
  63.           
  64. space:mov byte ptr es:[di],' '
  65.            add di,2                    ;加空格
  66.                   mov si,0
  67.                   mov ah,3
  68.                     int 10h
  69.                     inc dl
  70.           mov ah,2
  71.                     int 10h
  72.                     jmp keyb
  73.    backspace:cmp bp,0                ;当未输入而按退格时对操作不予回应
  74.                   je start
  75.                                  mov ah,3                ;设置光标
  76.                    int 10h
  77.                                   dec dl
  78.                                  mov ah,2
  79.                                    int 10h
  80.                                   dec bx               
  81.                                   mov byte ptr ds:[bx],0  ;清除内容
  82.                                    sub di,2
  83.                   mov byte ptr es:[di],' '
  84.                                    dec bp
  85.                                     jmp keyb                ;返回等待输入

  86. enter1:cmp bp,0                   ;如未输入字符按回车则判退出
  87.             je exit
  88.                     
  89. showw:mov cx,3                    ;等待过程中的显示(无实际意义如果不看应该也不会有影响)
  90.                     push dx                     ;我曾想在这里在读取光标(虽然没必要,但试过会使程序陷入死循环,不断循环此段。请高手指导为什么会这样?)
  91. shows:mov bx,cx
  92.            mov bp,offset show
  93.                    mov di,800
  94.            mov cx,44
  95.                    mov dh,5
  96.                    mov dl,44
  97.                    mov ah,2
  98.                      int 10h
  99. show1:mov dl,ds:[bp]
  100.            mov es:[di],dl
  101.                      inc bp
  102.                     add di,2
  103.                      loop show1
  104.             call wait0
  105.             call print
  106.                     call wait0
  107.                     call print
  108.                     call wait0
  109.                     call print
  110.                     call wait0
  111.                     call print
  112.                     call wait0
  113.                     mov cx,bx
  114.                     mov byte ptr es:[di-2],' '
  115.                     mov byte ptr es:[di-4],' '
  116.                     mov byte ptr es:[di-6],' '
  117.                     mov byte ptr es:[di-8],' '
  118.                       loop shows
  119.             mov cx,80
  120.                     mov di,800
  121. cls:  mov byte ptr es:[di],' '
  122.         add di,2
  123.                  loop cls
  124.                 pop dx
  125.                  int 10h
  126.          jmp turn

  127. wait0:mov cx,1200
  128. wait1:push cx
  129.          mov cx,0aaaah
  130. wait2:mov ax,ax
  131.             loop wait2
  132.            pop cx
  133.                     loop wait1
  134.            ret
  135. print:mov dl,ds:[bp]
  136.         mov es:[di],dl
  137.                   inc bp
  138.                  add di,2
  139.                  mov ah,3
  140.                    int 10h
  141.                    inc dl
  142.                  mov ah,2
  143.                    int 10h
  144.            ret          
  145.       
  146. turn: mov bp,offset orig          ;开始转换
  147.                 mov cx,20                   ;外层循环定位20个ascii码
  148. turn1:push cx
  149.          mov bx,offset table
  150.          mov cx,10
  151. turn2:mov dl,ds:[bp]              ;内层循环定位10个数字
  152.           cmp dl,ds:[bx]              ;利用表转换
  153.            je turn3
  154.                    inc bx
  155.             loop turn2
  156. turn3:mov ds:[bp],bl
  157.       inc bp
  158.       pop cx
  159.           loop turn1
  160.       
  161.           mov ax,0                    ;将2个独立数字整合成一个数字
  162.           mov bx,offset orig
  163.           mov bp,offset mark
  164.           mov cx,10
  165.           mov dl,10
  166. decib:mov al,ds:[bx]
  167.       mul dl                      ;将高位乘10再加低位
  168.       add al,ds:[bx+1]
  169.       mov ds:[bp],al
  170.       inc bp
  171.           add bx,2
  172.           loop decib
  173.           
  174.       mov bx,0                    ;用整合后的数字来比大小排名次
  175.           mov cx,10
  176.           mov bp,0                    ;以bp来做rank的偏移地址
  177. compa:push cx
  178.       mov cx,10
  179.           mov si,0                    ;以si作为比较时mark的偏移地址
  180.           mov ax,0                    ;以al计名次
  181. comp1:mov dl,mark[bx]
  182.       cmp dl,mark[si]
  183.       jb add1                     ;发现分高于的则名次加1
  184. comp2:inc si
  185.           loop comp1
  186.           inc al
  187.           mov rank[bp],al             ;将结果存入rank中
  188.           inc bx
  189.           inc bp
  190.           pop cx
  191.           loop compa
  192.           jmp output
  193.           
  194. add1: inc al                      ;当有分数高于此分数是计数加1
  195.       jmp comp2
  196.           
  197. output:mov bp,offset rank         ;将rank中内容转换后输出
  198.        mov cx,10
  199.            mov di,170
  200. div1:  mov al,ds:[bp]
  201.        mov ah,0
  202.            mov bl,10
  203.            div bl                     ;除以10将其转化为10进制
  204.            jmp turnrank
  205. div2:  mov es:[di],al
  206.            mov es:[di+2],ah
  207.            mov byte ptr es:[di+4],' '
  208.            inc bp
  209.            add di,6
  210.            loop div1
  211.           
  212.     p:mov si,offset sign          ;输出'Press any key to exit!'
  213.           mov cx,0
  214.           mov di,480
  215. sign1:mov cl,ds:[si]
  216.       jcxz ex
  217.       mov es:[di],cl
  218.       inc si
  219.       add di,2
  220.       jmp sign1
  221.           
  222. ex:   mov dh,3                     
  223.       mov dl,22
  224.           mov ah,2
  225.           int 16h                      ;问题:为什么电脑无视我设置光标位置的指令?
  226.       mov ax,0                     ;等待按键退出
  227.       int 16h
  228.       
  229. exit: mov ax,4c00h                 ;程序退出
  230.       int 21h

  231. turnrank:mov bl,al                 ;转换为ascii码
  232.          mov al,table[bx]
  233.          mov bl,ah
  234.          mov ah,table[bx]
  235.          jmp div2                           ;跳回原处
  236.                  
  237. cleanscreen:mov cx,2000            ;清屏
  238.             mov al,' '
  239.                         mov ah,07h
  240.                         cld
  241.                         rep stosw
  242.                         mov di,0
  243.                         ret

  244. code ends
  245. end start
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-8-30 15:44:19 | 显示全部楼层
自己顶一下,求高手回答啊
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-10 12:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表