如何用加法划分汇编语言?

时间:2019-04-18 02:04:15

标签: assembly binary cpu-architecture opcode

在高中的计算机工程课程中,我们被分配了一个作业,其中我们必须使用加法过程将两个数字除以汇编语言。

我们正在编程的玩具体系结构没有除法指令。该机器具有2的补码加法和按位与/或/异或运算,但不能直接相减:https://www.csie.ntu.edu.tw/~r03944025/intro2015/files/hw/appendix_c

(编者注,教科书未定义文本汇编语言,仅针对具有16个8位寄存器和有条件的if-if-zero指令的该装载/存储机器,定义了机器码操作码和操作数。)

1 个答案:

答案 0 :(得分:1)

因为我不想做你的学校作业,所以我只会给你一些提示:

  

如何使用加法除法...

这不是禁食方法,但是您可以执行以下操作:

material.shaderModifiers = [.fragment:
      """
      float4 backColor = float4(0.0, 0.0, 1.0, 1.0);// the camera screen color
      _output.color = _output.color * backColor;
       """ ];

如果A和B可能为负,请执行以下操作:

; Calculate C = A / B
Set C to 0
As long as A >= B:
    Increment C by 1
    Subtract B from A
  

玩具结构...具有2的补码加法和按位AND / OR / XOR操作...

...以及一条条件跳转指令,如果两个寄存器相等,则该条件跳转指令将执行循环操作。

这非常重要,因为仅使用按位运算和加法,某些运算结果的位0仅取决于操作数的位0。这意味着某些程序的最终输出的位0仅取决于输入的位0。

但是,对于两个除法0x30 / 0x10 = 3和0x20 / 0x10 = 2所有输入的位0为0,但在一种情况下,输出的位0为1,在另一种情况下,输出的位0为0 0。

  

但不能直接相减

有关您的CPU没有进行的某些操作的一些提示:

  • 可以通过XOR操作将数字的所有位取反。
  • 请回想一下如何将数字取反以补码。
  • 如果您可以对数字取反并添加数字,那么您应该也可以减去数字。
  • 请回想一下如何找出二的补码数是否为负。
  • 如果仅使用0 ... 127范围内的数字进行操作,则可以通过检查“(A-B)是否为负”来检查“ A 请注意,当您允许负输入时就是这种情况!
  • 如果您使用的是整个范围0 ... 255,则检查“ A
  • 如果第7位在A中为“ 1”,但在B中为“ 0”,则A
  • 如果第7位在A中为“ 0”,但在B中为“ 1”,则A
  • 如果位7在A和B中具有相同的值(两个位均为“ 0”或两个位均为“ 1”),则可以检查“(A-B)是否为负”