簡體   English   中英

在 LMC 中編程數組

[英]Programming arrays in LMC

我正在應對這個挑戰:

程序需要接受一個整數序列。 它以數字 999 結尾。整數(999 除外)放在一個列表中。 整數必須小於或等於 99。任何大於 99 的輸入都不會放在列表中。

如果輸入的數字超過十個,則只存儲前十個。

999 不是輸出的一部分。

我不知道如何將列表長度限制為十 (10) 個數字。 另外我不知道如何以相反的順序輸出列表。

這是我的代碼:

start   INP
        STA temp
        SUB big
        BRZ doout
        LDA temp
        SUB hundred
        BRP start
        sub one
        STA N
    
xx      STA ARR
        LDA xx
        add one
        sta xx
        BRA start
doout   HLT
temp    dat 0
big     dat 999
hundred dat 100
ARR     dat
one     dat 1
N       dat 10 

程序中的xx表明您沒有從如何在 LMC (little-man-computer) 的不同地址中存儲未知數量的輸入中得到提示

它解釋了如何使用自修改代碼遍歷數組——存儲值或加載它們。

在您的嘗試中,沒有處理輸出的部分。

對於節目的開頭部分我真的建議減去100,然后899(數額為999)。 這樣您就可以將(減少)輸入保留在累加器中而無需恢復它。

此外,由於 LMC 規范中的含糊不清,在SUB之后立即執行BRZ並不完全“安全”(這是因為當存在下溢時累加器的內容未定義/未指定,因此理論上它可以為 0)。 在分支代碼中執行BRZ之前,您應該始終先執行BRP 但是,由於輸入不能大於 999,因此BRP足以檢測相等性。

對於自修改部分,您可以在數組數據部分設置結束標記,並定義將在數組末尾讀取/存儲值的LDASTA指令。 每當你的代碼有那個確切的指令時,你就知道你已經到了最后。

這是它的工作原理:

 LDA store # Initialise dynamic store instruction STA dyna1 loop INP dyna1 STA array SUB toobig BRP skip LDA dyna1 ADD one STA dyna1 SUB staend BRP print BRA loop skip SUB trailer BRP print # Safer to do BRP than BRZ BRA loop # Input was less than 999 print LDA dyna1 # Convert dynamic store instruction SUB store # ... to index ADD load # ... to load instruction STA dyna2 loop2 LDA dyna2 SUB one STA dyna2 SUB load BRP dyna2 end HLT # all done dyna2 LDA array OUT BRA loop2 store STA array load LDA array staend STA after one DAT 1 toobig DAT 100 trailer DAT 899 array DAT DAT DAT DAT DAT DAT DAT DAT DAT DAT after DAT <script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>

如您所見(在此處運行腳本時), dyna1dyna2處的指令在它們所在的循環執行期間被修改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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