[英]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
足以檢測相等性。
對於自修改部分,您可以在數組數據部分設置結束標記,並定義將在數組末尾讀取/存儲值的LDA
和STA
指令。 每當你的代碼有那個確切的指令時,你就知道你已經到了最后。
這是它的工作原理:
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>
如您所見(在此處運行腳本時), dyna1
和dyna2
處的指令在它們所在的循環執行期間被修改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.