这是我在学习汇编时编写的一个简短的“计算器”程序。当有一个负值存储在answer
. 例如,如果我输入A 10 S 1 Q
Pep/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
指令之后累加器中的值会被吓坏。如果有人能解释原因,我将不胜感激。