簡體   English   中英

如何在LMC中檢測到計算大於999然后輸出999?

[英]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 的塊。

其他一些備注

  • 不要使用大小寫相同的標簽。 並非所有 LMC 模擬器都區分大小寫。
  • 您不需要兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM