0

年入力を(chariに)変換し、10進数として出力するこのコードがあります。私の問題は、誤って文字または空白が入力された場合、プログラムはエラーメッセージを出力し続けますが、新しい入力を再要求しません。たとえば、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

数字の後に Enter キーを押すと、次のようになります。 CPA 0x000A,i
BREQ exitentr
により、プログラムが終了する場合があります。実際には、各無効なキーの後、最初から読み取りが開始されます。もちろん、チェレクターの読み取りがバッファリングされていない限り、端末は改行まで文字を収集し、プログラムにバッファ全体を提供して、CHARI を使用して文字を読み取ります。

そのようなバッファリングはないと思います。

于 2013-11-20T14:32:23.313 に答える