0

我有这段代码可以将年份输入(转换为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
4

1 回答 1

0

如果在数字后按回车键,这些:CPA 0x000A,i
BREQ exitentr
可能会使程序终止。实际上,在每个无效键之后,读取从头开始。当然,除非 cherecter 读取被缓冲 - 终端收集字符直到换行,然后将整个缓冲区提供给程序以使用 CHARI 读取字符。

我有点猜想没有这样的缓冲。

于 2013-11-20T14:32:23.313 回答