关于系统时间的输出&跳出循环....帮帮忙...谢过先,急~~~~~~~~~
提示输入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
显示时间时, 那些待显示的在寄存器中的是相应项的数值, 不是对应的字符或者是字符串的地址. 所以要进行数值到显示字符串形式的转换才能正常显示出来