[英]How to detect in LMC that calculation is greater than 999 and then output 999?
我需要編寫一個 LMC 程序來解決 a+bx+x 2 。 進一步,如果結果大於999,則需要輸出999; 如果小於 999,則輸出結果。
我已經完成了 a+bx+x 2部分,但不知道如何在溢出時輸出 999。
這是我的代碼:
IN
STO a
IN
STO b
IN
STO x
LDA x
STO x2
bx LDA x
BRZ end
SUB one
STO x
LDA ans
ADD b
STO ans
BR bx
end LDA ans
LDA x2
STO y
xx LDA y
BRZ END
SUB ONE
STO y
LDA ANS
ADD x2
STO ANS
BR xx
END LDA ANS
ADD a
STO ANS
LDA ANS
ADD ans
SUB z
BRP postive
LDA ANS
OUT
HLT
postive LDA z
OUT
HLT
a DAT 000
b DAT 000
x DAT 000
x2 DAT 000
y DAT 000
z DAT 999
one DAT 001
ONE DAT 001
ans DAT 000
ANS DAT 000
您在計算上做得很好,確實很難檢測溢出(超過 999),因為通常 LMC 累加器無法存儲更大的值,並且在發生此類溢出時(在規范中)未定義累加器的值,也不是指定是否設置“否定”標志。 所以我們真的沒有什么可以用來檢測這種在所有 LMC 模擬器上都兼容的溢出。
訣竅是將表達式計算為 999 − (𝑎 − 𝑏𝑥 − 𝑥²) 並檢測負溢出(低於 0),為此我們有BRP
指令。 如果沒有負溢出,我們可以再次反轉該結果,因為 999 − (999 − (𝑎 − 𝑏𝑥 − 𝑥²)) 與 𝑎 − 𝑏𝑥 − 𝑥² 相同。 所以這意味着您將 999 加載到ans
,然后您將使用SUB
而不是ADD
,並且在每個SUB
您將檢查是否存在負溢出,如果是,則轉到將輸出 999 的塊。
ONE
或兩個ANS
數據字段。ans
並且不要依賴於您擁有ans DAT 0
的事實。 這是因為 LMC 具有重置功能,它不會重置數據,而只會將程序計數器設置回頂部。 這會導致錯誤的結果。這是更正和減少的代碼:
#input:1 2 3 INP STA a INP STA b INP STA x STA x2 LDA z # "inverse" ans SUB a # do this first loop STA ans LDA x BRZ output SUB one STA x LDA ans SUB x2 # subtract both x... BRP continue BRA overflow continue SUB b # ... and b BRP loop overflow LDA zero # prepare for outputing 999 (overflow) STA ans output LDA z SUB ans # 999 - (999 - (a + bx + x^2)) OUT HLT a DAT 0 b DAT 0 x DAT 0 x2 DAT 0 z DAT 999 ans DAT 0 zero DAT 0 one DAT 1 <script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>
您可以運行此代碼段中的代碼。 默認輸入已設置為 1 2 3,但您可以交互更改輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.