[英]How create an Little Mans Computer (LMC) code that will get a number. Display 1 if the number is odd, display 0 if the number is even
[英]How to check if a number is odd or even in little man computer
我需要幫助使我的程序生成正確的 output。
我目前正在使用此代碼:
INP
STA NUMBER
SUB DIVISOR
BRP VERIFY
BRA CHECK
LOOP STA NUMBER
LDA RESULT
ADD ONE
STA RESULT
VERIFY LDA NUMBER
SUB DIVISOR
BRP LOOP
LDA RESULT
ODD LDA ONE
STA RESULT
EVEN LDA 60
STA RESULT
CHECK LDA RESULT
BRP ODD
BRZ EVEN
OUT
HLT
NUMBER DAT
DIVISOR DAT 2
ONE DAT 1
RESULT DAT 0
當我在小人計算機模擬器上運行上面的代碼時,它只是循環和循環並打印 no output。我想做的是將輸入的數字分成兩部分並檢查它是否有余數。 如果有余數,則為奇數,否則為偶數。 我知道代碼有錯誤,但我無法確定問題出在哪里,也許你可以幫我解決。 提前致謝!
無限循環發生在BRP ODD
處。 請注意,當累加器為零時, BRP
也會分支。 所以它是一個“非負分支”指令。 當在ODD
處繼續執行時,它會下降到EVEN
,這使得ODD
處的代碼變得無關緊要。 在EVEN
時,累加器加載為零,因此BRP
將再次分支……無限。
還缺少對 0 的檢查:當輸入為零時,根本不應該執行減法。
沒問題,但是引用郵箱 60 可以更好地替換為引用 label,例如ZERO
。
該代碼包含實際上不需要的邏輯:
您已經包含了計算商的代碼,因為每次您從NUMBER
中減去DIVISOR
時,代碼都會將ONE
添加到RESULT
中。 然而, RESULT
最終被ONE
或 0(地址 60)覆蓋,因此商沒有計算出來。 由於您只想 output 輸入是奇數還是偶數,因此您應該從代碼中刪除商計算。
還要避免代碼重復。 您目前在兩個不同的地方執行SUB
。 這應該不是必需的,因為兩種情況下的邏輯應該相同。
這是簡化為基礎的代碼:
#input: 11 INP STA NUMBER LOOP BRZ OUTPUT # remainder is zero, so output a zero SUB DIVISOR BRP LOOP LDA ONE # when result is negative: input was odd OUTPUT OUT HLT NUMBER DAT DIVISOR DAT 2 ONE DAT 1 ZERO DAT 0 <script src="https.//cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>
您可以在此代碼段中運行模擬器,然后使用按鈕逐步執行代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.