我有这个代码将年份输入转换为chari并输出为十进制。我的问题是,如果错误地输入了一个字母或空格,程序会保持输出错误信息,但不会重新输入新的输入。例如,如果输入ABCD,它将为您提供4次错误消息并退出。
输入年份必须介于1900年至2049年(含)。
要重现错误,请尝试每个示例使用19a0或abcd。
我在哪里错了?
STRO welcome,d
entyear:STRO inptyear,d
readnomb:NOP1
initread:LDA -1,i
STA pos,d
LDA 0,i
STA integer,d
readchar:LDA 0,i
CHARI ascii,d
LDBYTEA ascii,d
CPA 0x000A,i
BREQ exitentr
CPA 0x002F,i
BRLE errlect
CPA 0x003A,i
BRGE errlect
SUBA 48,i
STA valint,d
LDX pos,d
ADDX 1,i
STX pos,d
BR convint
errlect: STRO msgerr,d
LDX 0,i
STX ascii,d
BR readnomb
multdix: LDA integer,d
ASLA
STA inttemp,d
ASLA
ASLA
ADDA inttemp,d
STA integer,d
LDX pos,d
SUBX 1,i
STX pos,d
convint: LDX pos,d
CPX 0,i
BRGT multdix
LDA integer,d
ADDA valint,d
STA integer,d
BR readchar
exitentr:LDX pos,d
CPX 0,i
BRLT end
dispint:LDA integer,d
CPA datemin,i
BRLT errlect
CPA datemax,i
BRGT errlect
DECO integer,d
STRO msgspace,d
BR entyear
end: STOP
welcome: .ASCII "Enter a year to convert to decimal\n"
.BYTE 0
inptyear: .ASCII "Year ?: "
.BYTE 0
msgerr: .ASCII "\nWrong caracter detected, please enter a new year: "
.BYTE 0
msgspace:.WORD 0x0A0A
.BYTE 0
inttemp: .WORD 0
valint: .WORD 0
pos: .WORD 0
datemin: .EQUATE 1900
datemax: .EQUATE 2049
integer: .WORD 0
ascii: .BYTE 0
.END
答案 0 :(得分:0)
如果您在数字后按Enter键,则:
CPA 0x000A,i
BREQ exitentr
可能会使程序终止。
实际上,在每个无效键之后,读数从头开始。
当然,除非缓存了更简洁的读数 - 终端收集字符直到换行,然后向程序提供整个缓冲区以使用CHARI读取字符。
我有点猜测没有这样的缓冲。