【发布时间】:2019-09-08 07:50:29
【问题描述】:
在高中的一门计算机工程课上,我们被分配了一项作业,我们必须通过加法过程用汇编语言将两个数字相除。
我们正在编程的玩具架构没有除法指令。本机有2的补码加法和按位AND/OR/XOR运算,但没有直接减法:https://www.csie.ntu.edu.tw/~r03944025/intro2015/files/hw/appendix_c
(编者注,教科书没有定义文本汇编语言,只有机器码操作码和操作数,用于这个带有 16 个 8 位寄存器和条件跳转指令的加载/存储机器。)
【问题讨论】:
-
你能假设你的两个输入都是非负的(或者至少有相同的符号)吗?如果没有,您必须处理这种可能性并使用绝对值。除此之外,该算法在谷歌上很容易找到,例如Division returning quotient and remainder using a loop and subtraction?。更好的算法(O(log n) 而不是 O(n))是可能的,例如Implement division with bit-wise operator
-
@PeterCordes - 在这种情况下,复杂的事情是条件分支仅适用于寄存器 x == 寄存器 0,没有 或 >=。
-
@rcgldr:这是一个很好的观点。但是您可以使用
AND+BNZ来测试寄存器是否为负,因此如果您将范围限制为有符号值,则可以使用它。所以是的,对于留下余数的除法,检测结束是循环的重要部分,如do { quotient++; dividend += -divisor; } while( dividend >= 0 ); -
@PeterCordes - Martin Rosenau 在他的回答中涵盖了这一点。由于这些是 8 位寄存器,因此可以使用 3 个递增计数器(或根据需要递减负数)来缓慢完成。
标签: assembly binary cpu-architecture opcode