LMC:包括从十进制到9的基数转换

时间:2019-03-29 02:43:07

标签: javascript little-man-computer

我正在尝试创建一个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,因为我不确定其是否相同所有基础的算法。

我在这里有点困惑,但是即使有人可以帮助我理解如何使代码理解该部门的其余部分也会对我有很大帮助。我是新来的,因此如果让任何人感到困惑,请先抱歉。

谢谢。

1 个答案:

答案 0 :(得分:0)

我假定输出应该是一系列单位数字,它们以给定的基本符号表示给定的十进制数字。

您可以使用基于数据的方法:将2、3、4,...和9的所有相关幂存储在内存(邮箱)中。我们只需要不大于999的幂,因此此列表是受限制的:

  • 基数2:1 2 4 8 16 32 64 128 256 512
  • 基数3:1 3 9 27 81 243 729
  • 以4为基数:1 4 16 64 256
  • 以5为基数:1 5 25 125 625
  • 以6为基数:1 6 36 216
  • Base 7:1 7 49 343
  • 以8为基数:1 8 64 512
  • 以9为基数:1 9 81 729

这还有一个优点,您不必执行那么多的减法。想象一下,输入为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>

这将使用几乎所有可用的邮箱。也许仍然可以对空间使用进行一些优化。