[英]How to produce dividend and remainder in a little man computer program?
我正在嘗試編寫一個 LMC 程序,它需要兩個 integer 輸入,將它們相除,然后產生商和余數。 首先,我將問題分解為 4 個階段:
1.將 num1 除以 num2 得到商 q。
2.將q和num2相乘得到確切的乘數,並將其存儲在num2中。
3.從num1中減去num2,並將答案存儲在rem中。
4.Output q 和 rem。
這是我寫的代碼:
INP
STA NUM1
LDA NUM1
STA ORG
INP
STA NUM2
BRZ END
LDA 99
STA Q
LOOP LDA NUM1
BRZ END
LDA NUM1
SUB NUM2
STA NUM1
LDA Q
ADD ONE
STA Q
BRA LOOP
LDA Q
STA NUM3
LDA NUM2
SUB ONE
STA NUM2
LOOP LDA NUM2
BRZ END
LDA NUM3
ADD Q
STA NUM3
LDA NUM2
SUB ONE
STA NUM2
BRA LOOP
LOAD ORG
SUB NUM3
STA REM
END LDA Q
OUT Q
LDA REM
OUT REM
HLT
NUM1 DAT
NUM2 DAT
ORG DAT
Q DAT
ONE DAT 1
TOTAL DAT
NUM3 DAT
REM DAT
當我嘗試在 LMC 模擬器中運行代碼時,它不會產生結果,而是無限期地繼續計算。 我怎樣才能讓它工作? 有一個更好的方法嗎? 任何幫助是極大的贊賞。
有一個更好的方法嗎?
你的方法是合乎邏輯的,但可能有點矯枉過正。 只做除法,當你不能再從被除數中減去除數時停止,將同時產生商和余數。
例如,如果你想將 13 除以 4,然后從 13 中減去 4,得到 9,然后從 9 中減去 4,得到 5,然后從 5 中減去 4,得到 1,現在我們停止,因為 4 大於 1(我們不能減去沒有消極)。 商是我們能夠減去 4 的次數(即 3 次),余數是停止后剩下的,這里是 1。
我怎樣才能讓它工作?
至於為什么您的代碼會執行無限循環,您可能只是在使用BRZ
尋找精確的除法。 您應該考慮改用BRP
,這將允許非零余數。 您應該在 LMC 調試器中單步執行,以查看為什么它在您希望的時候不停止。
你的程序有幾個問題:
OUT
不接受參數。 它不應該是OUT Q
,而只是OUT
。 一個好的 LMC 模擬器應該會抱怨這一點。LOOP
被定義為 label。 這是模棱兩可的。 一個好的 LMC 模擬器應該會抱怨這一點。END
處的指令之前, BRA LOOP
下方的代碼是不可訪問的。 這是死代碼。NUM1
變為零時才能退出循環,但這可能永遠不會發生。 例如,如果您將 4 除以 5,則減法將產生負溢出,並且累加器不會為零(實際上它不是由語言定義的,它將具有哪個值)。 您應該使用BRP
構建循環條件邏輯,而不是在那里使用BRZ
。Q
的初始化取自郵箱 99,但假設您的程序不占用郵箱 99。這是真的,但最好將 label 用於DAT 0
。LDA NUM1
)不是必需的,因為累加器已經具有該值。您要實現的算法有點冗長。 在你從第一個數字中減去第二個數字並且不可能再減去之后,你已經有了余數(如果你做對了)。
您的算法還應該以不同的方式處理 0 除數:在這種情況下,可能 output 一些預定義的值表示商未定義,例如 999。
這是您如何編寫代碼的方法。 這是一個可運行的片段,其中包含一些您可以調整的示例輸入:
#input: 19 5 LDA zero # initialise STA quotient INP STA remainder INP STA divisor BRZ error # division by 0 is undefined loop LDA remainder SUB divisor BRP continue end LDA quotient # output the results OUT LDA remainder OUT HLT continue STA remainder LDA quotient ADD one STA quotient BRA loop error LDA big # output 999 twice to indicate error OUT OUT HLT remainder DAT divisor DAT quotient DAT zero DAT 0 one DAT 1 big DAT 999 <script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.