在高中的计算机工程课程中,我们获得了一项任务,我们必须通过使用添加过程在汇编语言中划分2个数字。
我们正在编程的玩具架构没有分区指令。该机器具有2的补码加法和按位AND / OR / XOR运算,但不能直接减法:https://www.csie.ntu.edu.tw/~r03944025/intro2015/files/hw/appendix_c
(编者注:教科书没有定义文本汇编语言,只有这个带有16个8位寄存器的加载/存储机器的机器代码操作码和操作数,以及条件跳转 - 如果 - 零指令。)
因为我不想做你的学校作业,我只会给你一些提示:
怎么划分...使用加法?
这不是最快的方法,但您可以执行以下操作:
; 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没有的一些操作的一些提示: