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

问题描述 投票:0回答:1

在高中的计算机工程课程中,我们获得了一项任务,我们必须通过使用添加过程在汇编语言中划分2个数字。

我们正在编程的玩具架构没有分区指令。该机器具有2的补码加法和按位AND / OR / XOR运算,但不能直接减法:https://www.csie.ntu.edu.tw/~r03944025/intro2015/files/hw/appendix_c

(编者注:教科书没有定义文本汇编语言,只有这个带有16个8位寄存器的加载/存储机器的机器代码操作码和操作数,以及条件跳转 - 如果 - 零指令。)

assembly binary cpu-architecture opcode
1个回答
1
投票

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

怎么划分...使用加法?

这不是最快的方法,但您可以执行以下操作:

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

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

Set D to 0
If A is negative:
    Set D to 1
    Negate A
If B is negative:
    Xor D with 1
    Negate B
Perform C = A / B (see above)
If D != 0:
    Negate C

玩具架构......有2个补码加法和按位AND / OR / XOR运算......

...和条件跳转指令,如果两个寄存器相等则跳转,以及旋转操作。

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

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

但不能直接减法

关于CPU没有的一些操作的一些提示:

  • 可以通过XOR运算来反转数字的所有位。
  • 请回想一下如何否定两个补码中的数字。
  • 如果您能够否定数字并添加数字,您还应该能够减去数字。
  • 请回忆一下如何判断二的补码是否为负数。
  • 如果仅使用0 ... 127范围内的数字进行操作,则可以通过检查“(A-B)是否为负”来检查“A <B”。 请注意,当您允许负输入时就是这种情况!
  • 如果您使用0 ... 255的整个范围进行操作,则检查“A <B”更加困难: 如果A中的第7位为“1”而B中为“0”,则A <B为假 如果A中的位7为“0”而B中为“1”,则A <B为真 如果第7位在A和B中具有相同的值(两个位均为“0”或两个位均为“1”),则可以检查“(A-B)是否为负”
© www.soinside.com 2019 - 2024. All rights reserved.