2

我正在尝试创建一个 LMC 汇编代码,该代码将允许用户输入两个输入:一个十进制数和该数字应转换为的基数。该代码应该能够将任何十进制数转换为包括 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. 现在以相反的方式阅读它,以 2 为底的十进制 12 是 110。

但同样,即使是 1-3= -2:我如何才能理解其余部分是 1?

另外,我怎样才能让代码理解它在哪个基础内?我是否首先创建一个长代码来检测碱基?假设它BRA取决于它是哪个基础,那么我什至不确定它是否对于所有基础都是相同的算法......

我在这里有点困惑,但即使有人可以帮助我理解如何编写代码来获取除法的其余部分,那也会对我有很大帮助。

4

1 回答 1

1

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

您可以使用基于数据的方法:将 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
  • 基地 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>

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

于 2019-11-24T20:03:51.517 回答