如果不是数字,PEP8会要求新的输入

时间:2013-02-16 14:38:42

标签: assembly pep8-assembly

我有这个代码将年份输入转换为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

1 个答案:

答案 0 :(得分:0)

如果您在数字后按Enter键,则:          CPA 0x000A,i          BREQ exitentr
可能会使程序终止。 实际上,在每个无效键之后,读数从头开始。 当然,除非缓存了更简洁的读数 - 终端收集字符直到换行,然后向程序提供整个缓冲区以使用CHARI读取字符。

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