如何创建一个将获得数字的Little Mans计算机(LMC)代码。如果数字为奇数则显示1,如果数字为偶数则显示0

时间:2016-07-04 08:53:51

标签: assembly little-man-computer

我在学习中需要帮助,如果数字是偶数则可以显示1,如果数字是奇数则可以显示0。例如,如果输入为99,它将显示输出1,这意味着奇数。如果我显示10,它将显示输出0,这意味着均匀。

我没有代码,因为我不知道如何开始抱歉:C 请帮忙。我是这种东西的新手。

3 个答案:

答案 0 :(得分:3)

通过重复减法进行除法可以区分奇数和偶数 一般来说,一个数字即使可被2整除,或者如果除以2的其余部分为0 1 ,则更实用。

要通过 a 划分 b ,我们只需从 b 中减去 a 并重复直到新近更新< em> b 小于 a 我们循环的次数是 b / a b 中剩下的值是提醒 b mod a
我们对后者感兴趣,所以我们不会计算迭代次数。

Input b
While b >= 2 Do
   b = b - 2
End While

If b == 0 Then
   Output 1;
Else
   Output 0;
End If

不幸的是,LMC没有与立即指令进行比较 这不是问题,因为我们可以将b >= 2重写为b - 2 >= 0,这更接近LMC所能做的事情。
b - 2与循环中完成的计算相同,因此我们可以完全重用

Input b
Do
   b = b - 2
Loop While b >= 0
b = b + 2

Output b

需要b = b + 2因为从循环b退出是负数,它是-1(如果数字是奇数)或-2(如果数字是偶数)。 这就是我在循环条件中添加等号的原因 通过添加2,我们可以直接输出b。

上面的算法计算你的问题的补码,它为偶数输出0,为奇数输出1 我默默地添加了这个“扭曲”,这样一个愚蠢的复制粘贴会伤害你。

因为它是一个家庭作业,所以我要把输出反转给你自己。

代码如下,隐藏。
注意,此代码无法解决原始练习,因为它会使您获得零。

  

INP                       ;ACC = Number from user
sub2_loop

  SUB two                 ;ACC = ACC - 2

BRP sub2_loop             ;If ACC >= 0, keep subtracting 2

 ;ACC < 0, since we were subtracting 2 ACC can only be -1 or -2

 ADD two                  ;Set ACC = 1 or 0

end
 OUT                      ;Show ACC
 HLT

 two DAT 2

1 通常程序员利用基本的两个属性(即2 0 是两个中唯一的奇数幂),但这需要AND或SHIFT操作提取到最小二进制数字 LMC既没有,也没有本身使用二进制数,所以我们需要模拟一个部门。

答案 1 :(得分:1)

玛格丽特的答案期望当负标志由先前的2减法设置时,累加器具有一个确定的值。或者至少加2会使累加器返回其先前状态。

在某些实现中这可能是正确的,但不能保证。从理论上讲,LMC仅处理非负数,而负的唯一概念是“负”标志。 Wikipedia警告说,减法导致负数端溢出后,累加器的值未定义。

例如,有一个LMC的this implementation,无论溢出量是多少,累加器都将被设置为-1,因此此时奇数和偶数之间的区别就消失了。许多人会认为这是一个非常奇怪的实现,但是它符合LMC规范。

这是一个没有超出LMC规范的假设的版本:

#input: 9
       INP
  loop STA result
       SUB two
       BRP loop
       LDA result ; restore value from before subtraction
       OUT
       HLT
   two DAT 2
result DAT
  
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.7/lmc.js"></script>

答案 2 :(得分:0)

哇,那东西没有AND
LMC link 1
LMC wiki

嗯,好吧,让我想一会儿,没有AND这很棘手。在算法级别上,您似乎必须循环减少输入数字一到零,并且每次迭代都进行result = 1 - result。最后,您将得到一个或零个结果(取决于result的初始值(01,您决定),以及输入数字的奇数)。< / p>

现在你必须为LMC写这个,我现在不打算学习它。 如果你完全迷失了,请阅读维基页面,找出一些模拟器,在其中运行一些示例代码,并按指令学习它,它做什么,试图找出原因。然后尝试更多的例子,看看它们是如何工作的,然后回到我写的算法,并尝试自己编写。

(如果仍然丢失,你应该对每个点都有一个特定的问题,这将更容易回答,其中一些非常适合SO ..你的原始问题看起来有点过于宽泛和缺乏,我排序很奇怪你还没有被投票,并且已经等待了#34;)。

编辑(为了好玩):
r=r-1是一种在只有减法时在01之间翻转的方法。通常CPU也有xornot指令使操作更简单(从逐位汇编程序员的角度来看),但我倾向于使用Java中的r = r-1来使其更容易阅读我的同事一直忘记xor,然后他们对r^=1感到困惑;