0

这是我在学习汇编时编写的一个简短的“计算器”程序。当有一个负值存储在answer. 例如,如果我输入A 10 S 1 QPep/8,我9最终会得到 a 作为答案,正如预期的那样。如果我减去或否定答案并且我得到否定,那么它之后的下一个命令会分支到无效的响应消息。似乎当存储有否定答案时answer,进入累加器的下一个命令是错误的。如果我A 1 S 2在它之后输入下一个命令,将无法正确输入。在这种情况下,如果我A 1 S 2 A 3的累加器在CHARO input,s执行,而是一个无意义的负值。在调试模式下,我可以看到累加器中的值为 -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指令之后累加器中的值会被吓坏。如果有人能解释原因,我将不胜感激。

4

0 回答 0