首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

关于系统时间的输出&跳出循环.帮帮忙.谢过先,该怎么处理

2012-03-23 
关于系统时间的输出&跳出循环....帮帮忙...谢过先,急~~~~~~~~~提示输入1,2,3其中之一,以执行相应程序:输出

关于系统时间的输出&跳出循环....帮帮忙...谢过先,急~~~~~~~~~
提示输入1,2,3其中之一,以执行相应程序:输出输入的是几,并且显示年月日时分秒   .
现在无法跳出循环,而且,时间显示不了,不知道在哪里出错了...            

                DATA     SEGMENT
            STRING     DB                 'Input   the   number   1~3   ,input   other   to   exit ',0AH,0DH, '$ '
                    CR     DB                 0AH,0DH, '$ '
          STRING1     DB                 'You   input   1 ',0AH,0DH, '$ '
          STRING2     DB                 'You   input   2 ',0AH,0DH, '$ '
          STRING3     DB                 'You   input   3 ',0AH,0DH, '$ '

                YEAR     DW                 ?
              MONTH     DB                 ?
                  DAY     DB                 ?

              HOURS     DB                 ?
          MINUTES     DB                 ?
            SECOND     DB                 ?


                DATA     ENDS
            STACK1     SEGMENT       PARA   STACK
                            DW                 20   DUP   (0)
            STACK1     ENDS
              COSEG     SEGMENT
                            ASSUME         CS:   COSEG,DS:   DATA
            START:     MOV               AX,DATA
                            MOV               DS,AX
                LOP:
                            MOV               DX,OFFSET   STRING
                            MOV               AH,09H
                            INT               21H
                            MOV               AH,01H


                            INT               21H
                            CMP               AL,36H             ;想在这里设定退出条件,除了输入1,2,3会有响应其他的不会,但现在不行,跳不出循环
                            JNC               ENDO
                            SUB               AL,30H
                            MOV               BL,AL
                            DEC               BL
                            MOV               AL,BL
                            SHL               BL,1
                            ADD               BL,AL
                            MOV               DX,OFFSET   CR
                            MOV               AH,09H
                            INT               21H
                            ADD               BX,OFFSET   JUMP_TABLE
                            JMP               BX

                            JUMP_TABLE:               JMP   SUB1
                            JMP               SUB2
                            JMP               SUB3

;运行不通过

  TIMESHOW:     MOV               AH,24H             ;时间显示
                            INT               21H
                            MOV               YEAR,   CX         ;年
                            MOV               MONTH,DH         ;月
                            MOV               DAY,DL             ;日



                            MOV               DX,YEAR           ;输出
                            MOV               AH,09H
                            INT               21H

                            MOV               DL,MONTH
                            MOV               AH,05H
                            INT               21H

                            MOV               DL,DAY
                            MOV               AH,05H
                            INT               21H

                            MOV               AH,2CH
                            INT               21H
                            MOV               HOURS,CH         ;小时
                            MOV               MINUTES,CL     ;分钟
                            MOV               SECOND,DH       ;秒

                            MOV               DL,HOURS         ;输出
                            MOV               AH,05H
                            INT               21H

                            MOV               DL,MINUTES
                            MOV               AH,05H
                            INT               21H

                            MOV               DL,SECOND


                            MOV               AH,05H
                            INT               21H


                            JMP               LOP


              SUB1:     MOV               DX,OFFSET   STRING1
                            MOV               AH,09H
                            INT               21H
                            JMP               TIMESHOW
              SUB2:     MOV               DX,OFFSET   STRING2
                            MOV               AH,09H
                            INT               21H
                            JMP               TIMESHOW
              SUB3:     MOV               DX,OFFSET   STRING3
                            MOV               AH,09H
                            INT               21H
                            JMP               TIMESHOW


              ENDO:     MOV               AH,4CH
                            INT               21H
              COSEG     ENDS
                            END               START


 

                           



[解决办法]
输入字符后的比较 cmp al, 36h 不对吧. 如果是限定了 1-3, 应该是:
cmp al, '1 '
jb END0
cmp al, '3 '
ja END0

获取当前时间的 dos 调用功能号是 2ch, 不是 24h

计算跳转地址时有些问题. 从算法中看出来每个项占用 3 字节. 但你的代码通常形成的是 short 类跳转, 只占用两个字节, 所以会出错. 可以强制使用 near 转移:
jump_table:
jmp near ptr sub1
jmp near ptr sub2
jmp near ptr sub3

显示时间时, 那些待显示的在寄存器中的是相应项的数值, 不是对应的字符或者是字符串的地址. 所以要进行数值到显示字符串形式的转换才能正常显示出来

热点排行