簡體   English   中英

如何在小人計算機程序中產生股息和余數?

[英]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.

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