负值导致累加器出现奇怪现象

时间:2015-11-07 02:45:29

标签: assembly accumulator pep8-assembly

这是一个简短的计算器"我在学习装配时写的程序。当answer中存储负值时,我遇到了问题。例如,如果我将A 10 S 1 Q输入到Pep / 8中,我最终得到一个9作为答案,正如预期的那样。如果我减去或否定答案而得到否定,则在分支到无效响应消息后的下一个命令。似乎在answer中存储了否定答案时,进入累加器的下一个命令是错误的。如果我输入A 1 S 2之后的下一个命令将无法正确输入。在这种情况下,如果我有A 1 S 2 A 3累加器在执行CHARO input,s后其中没有值(对于' A'),而是非感知负数值。在调试模式中,我可以看到累加器中的值为-191而不是65.我的问题是,为什么会发生这种情况?为什么在回答中的负值导致将值输入累加器的方式不同?

         BR      Main
input:   .EQUATE 4
answer:  .EQUATE 2 
number:  .EQUATE 0
msg0:    .ASCII  "Menu: \nA: Add \nS: Subtract \nN: Negate \nQ: Quit \nAnswer: \x00"
msg1:    .ASCII  "Input option: \x00"
msg2:    .ASCII  "Input number: \x00"
msg3:    .ASCII  "Answer: \x00"
msg4:    .ASCII  "The calculator has ended. \x00"
msg5:    .ASCII  "Input was invalid. \x00"

Main:    SUBSP   6,i
         LDA     0,i
         STA     answer,s
         STRO    msg0,d
         DECO    answer,s
         CHARO   '\n',i
         CHARO   '\n',i

Menu:    CHARI   input,s
         LDBYTEA input,s
         CPA     'A',i 
         BREQ    Add
         CPA     'S',i
         BREQ    Subtract
         CPA     'N',i 
         BREQ    Negate
         CPA     'Q',i
         BREQ    Quit
         BR      Invalid

Add:     DECI    number,s
         LDA     answer,s
         ADDA    number,s
         STA     answer,s
         STRO    msg1,d
         CHARO   input,s
         CHARO   '\n',i
         STRO    msg2,d
         DECO    number,s
         CHARO   '\n',i
         STRO    msg3,d
         DECO    answer,s
         CHARO   '\n',i
         CHARO   '\n',i
         BR      Menu

Subtract:DECI    number,s
         LDA     answer,s
         SUBA    number,s
         STA     answer,s
         STRO    msg1,d
         CHARO   input,s
         CHARO   '\n',i
         STRO    msg2,d
         DECO    number,s
         CHARO   '\n',i
         STRO    msg3,d
         DECO    answer,s
         CHARO   '\n',i
         CHARO   '\n',i
         BR      Menu

Negate:  LDA     answer,s
         NEGA
         STA     answer,s
         STRO    msg1,d
         CHARO   input,s
         CHARO   '\n',i
         STRO    msg3,d
         DECO    answer,s
         CHARO   '\n',i
         CHARO   '\n',i
         BR      Menu

Quit:    STRO    msg4,d
         BR      Stop

Invalid: STRO    msg5,d
         BR      Stop

Stop:    ADDSP   6,i
         STOP
         .END

编辑:我通过在输入之前简单地清除累加器中的内容来找到解决问题的方法。这是我所做的改变,现在该程序按预期工作:

Menu:    CHARI   input,s
         LDA     0,i
         LDBYTEA input,s
         CHARI   input,s
         STBYTEA input,s
         CPA     'A',i 
         BREQ    Add
         CPA     'S',i
         BREQ    Subtract
         CPA     'N',i 
         BREQ    Negate
         CPA     'Q',i
         BREQ    Quit
         BR      Invalid

虽然这有效,但我还是不完全理解为什么累加器中的值在NEGA指令后变得很糟糕。如果有人能解释原因,我会很感激。

0 个答案:

没有答案