我正在努力应对以下挑战:
编写一个LMC程序,可以将n位二进制数转换为十进制数。在停止程序之前将自然数显示为输出。第一个输入确定 n 的值。假设该值等于四或更大。例如,如果第一个输入是八 (8),则请求八个后续输入。如果后续输入编号为 1, 0, 0, 1, 0, 0, 0, 0,则输出将为 9。n 个输入值由用户提供,每一位一个:其中第一个是最小的 -重要位。第 n 个输入是最高有效位。
我的尝试:
IN
BRZ INVALID_N
STO N
LDA N
SUB FOUR
BRP VALID_N
INVALID_N:HLT
VALID_N:LDA ZERO
STO RESULT
LDA ONE
STO POWER
LOOP: BRZ OUTPUT
STO COUNT
IN
BRZ NEXT
LDA RESULT
ADD POWER
STO RESULT
NEXT: LDA POWER
ADD POWER
STO POWER
LDA COUNT
SUB ONE
BR LOOP
OUTPUT: LDA RESULT
OUT
BR LOOP
ZERO: HLT
ONE: DAT 1
POWER: DAT 32
COUNT: DAT 1
RESULT: DAT 21
N: DAT 0
FOUR: DAT 4
尽管我的代码转换了 n 个大于且等于 4 的二进制数字,但每次我输入 n 个二进制数字时,它都会显示“LMC out篮子”。即使将 n 个二进制转换为十进制后,它仍会继续循环。
我的错误是什么?
是的,如果 的值
N
至少为 4,您的程序将永远不会到达HLT
label 处ZERO
,因为在它之前您有一条BR
返回到 的指令LOOP
。所以仅从这一点我们就可以看出它永远不会停止。如果删除它,仍然存在一些其他问题
BR LOOP
:该指令
LOOP: BRZ OUTPUT
会在OUTPUT
第二次到达时分支到那里。这是因为累加器的值为COUNT
,开始时为 1,在跳回到 之前减 1LOOP
。这意味着您的程序只会从输入中读取一个“位”,而不会读取输入中剩余的其他位。在您的程序检查第一个输入至少为 4 后,它不再查看
N
,但它需要它知道要从输入中读取多少个值。您实际上不需要COUNT
,而是应该减少N
直到为零。要纠正您的程序:
STO COUNT
BR LOOP
该行前面的ZERO: HLT
LDA COUNT
用。。。来代替LDA N
SUB ONE
添加一行之后STO N
通过这些更改,它应该可以工作。
然后您还可以删除
COUNT: DAT 1