我正在尝试创建一个LMC汇编代码,该代码将允许用户将第一个INPUT输入为十进制数字,将第二个INPUT输入为该数字应转换为的基数。该代码应能够将任何十进制数字转换为2到9的基数。
我知道LMC上不可用该除法,我可以使用减法来说从十进制的12到基数3,这样我就能得到12-3-3-3-3 = 4,但是我怎么能使代码了解除法的其余部分12/3 = 4,除法的其余部分为0,4-3 = 1,但4/3 = 1,...所以除法的其余部分为1-3 =- 2和1/3是0,33 ...所以其余的是1,现在相反地读它意味着12 dec到2的底数是110,但是即使是1-3 = -2,我又如何才能理解剩下的是1
此外,我如何使代码理解它是在哪个基础中创建的,因此我首先会创建一个长代码,它会检测到该基础,并说要根据它是哪个基础而转到BRA,因为我不确定其是否相同所有基础的算法。
我在这里有点困惑,但是即使有人可以帮助我理解如何使代码理解该部门的其余部分也会对我有很大帮助。我是新来的,因此如果让任何人感到困惑,请先抱歉。
谢谢。
答案 0 :(得分:0)
我假定输出应该是一系列单位数字,它们以给定的基本符号表示给定的十进制数字。
您可以使用基于数据的方法:将2、3、4,...和9的所有相关幂存储在内存(邮箱)中。我们只需要不大于999的幂,因此此列表是受限制的:
这还有一个优点,您不必执行那么多的减法。想象一下,输入为999和2为基数时的区别。如果已经有2的乘方(最大为512),则只能进行9次减法,而如果尝试仅进行2次减法,则做数百次减法...
因此,考虑到这些能力,请在该列表中使用“指针”(通过自我修改代码),该指针将首先找到属于给定基数的能力范围, 然后从那里取它,以从原始数字中反复减去幂(从大到小),以确定每个输出位数。
请注意,只要没有输出,就可以避免输出零。
以下是该代码的编码方式:
#input: 12 2
INP // number
STA DECIMAL
INP // base
SUB ONE
STA BASE
LOOPBASE LDA BASE // count down to find powers of base
SUB ONE
STA BASE
BRZ DIVIDE
LOOPPOW LDA CODE1 // take next power
ADD ONE
STA CODE1 // self-modifying
LDA ONE // is it 1?
CODE1 SUB POWER
BRZ LOOPBASE // yes...
BRA LOOPPOW // no...
DIVIDE LDA CODE1
ADD ONE
STA CODE2
BRA ENTRY
LOOP STA DECIMAL
LDA DIGIT
ADD ONE
STA DIGIT
ENTRY LDA DECIMAL
CODE2 SUB POWER
BRP LOOP
LDA FIRST // do not output prepadded 0
BRZ OUTPUT // not the first digit
LDA DIGIT
BRZ SKIP
OUTPUT LDA DIGIT
OUT
SUB DIGIT
STA FIRST // no longer first digit
SKIP STA DIGIT
LDA CODE2
ADD ONE
STA CODE2 // self-modifying
STA CODE3 // self-modifying
LDA ONE // is power 1?
CODE3 SUB POWER
BRP FINISH // yes
BRA ENTRY
FINISH LDA DECIMAL
OUT
HLT
DECIMAL DAT
BASE DAT
DIGIT DAT
FIRST DAT 1
POWER DAT
DAT 512 // powers of 2
DAT 256
DAT 128
DAT 64
DAT 32
DAT 16
DAT 8
DAT 4
TWO DAT 2
ONE DAT 1
DAT 729 // powers of 3
DAT 243
DAT 81
DAT 27
DAT 9
DAT 3
DAT 1
DAT 256 // powers of 4
DAT 64
DAT 16
DAT 4
DAT 1
DAT 625 // powers of 5
DAT 125
DAT 25
DAT 5
DAT 1
DAT 216 // powers of 6
DAT 36
DAT 6
DAT 1
DAT 343 // powers of 7
DAT 49
DAT 7
DAT 1
DAT 512 // powers of 8
DAT 64
DAT 8
DAT 1
DAT 729 // powers of 9
DAT 81
DAT 9
DAT 1
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.7/lmc.js"></script>
这将使用几乎所有可用的邮箱。也许仍然可以对空间使用进行一些优化。