- INTERRUPT HANDLER -从IN.1到IN.4 >在值从0到1之间写入输入号>两个中断在同一个输入周期中永远不会改变


昨晚上床睡觉的时候我被困在这上面了。当然,就像任何优秀的程序员一样,睡觉是我完成大部分工作的时候。
我的主要目标是减少周期计数。如果上面的..。呃,图形..。有什么可参考的吗,看起来我的周期计数要少得多。次要的是减少指令计数(但不是以周期计数为代价)。我可以想象如何将其降低到7个节点,而不是9个节点,但我无法想象这也会提高程序的效率(就周期计数而言)。
那么,我如何在这里减少循环计数呢?
MOV UP, ACC
START:
MOV 0, DOWN
JEZ CHECK
JNZ CONTINUE
CHECK:
MOV UP, ACC
JEZ START
MOV 1, DOWN
CONTINUE:
MOV UP, ACC
JMP STARTMOV UP, ACC
START:
MOV 0, DOWN
JEZ CHECK
JNZ CONTINUE
CHECK:
MOV UP, ACC
JEZ START
MOV 2, DOWN
CONTINUE:
MOV UP, ACC
JMP STARTMOV UP, ACC
START:
MOV 0, DOWN
JEZ CHECK
JNZ CONTINUE
CHECK:
MOV UP, ACC
JEZ START
MOV 3, DOWN
CONTINUE:
MOV UP, ACC
JMP STARTMOV UP, ACC
START:
MOV 0, DOWN
JEZ CHECK
JNZ CONTINUE
CHECK:
MOV UP, ACC
JEZ START
MOV 4, DOWN
CONTINUE:
MOV UP, ACC
JMP STARTMOV UP, RIGHTADD LEFT
ADD UP
MOV ACC, RIGHT
MOV 0, ACCADD LEFT
ADD UP
ADD RIGHT
MOV ACC, DOWN
MOV 0, ACCMOV UP, LEFTMOV ANY, DOWN
发布于 2015-08-03 13:52:06
您可以交换JEZ和JNZ,然后删除noop跳转以检查,而且因为开始前的指令与JMP之前的指令相同,所以可以删除以下两个指令:
MOV UP, ACC
START:
MOV 0, DOWN
JNZ CONTINUE
MOV UP, ACC
JEZ START
MOV 1, DOWN
CONTINUE:如果你不介意使用更多的节点,你可以简化节点2,3,通过让它加起来,右加,MOV ACC,DOWN (还有MOV 0,ACC)
然后节点3,2 MOVs UP, RIGHT和节点3,3是节点2,2的副本。这消除了2,3作为一个瓶颈,需要收集3个值,而是让其他节点帮助收集它们。
发布于 2015-08-04 18:40:41
我在顶部有三个部分的节点中有代码。假的:
Label ZERO # is called while the input == 0
Sub UP # ACC will still be 0 if no input,
# or -1 if we are now receiving
JMP TOGGLE_ONE # if ACC < 0 or
Move 0 down # no input change
JMP ZERO # if ACC == 0
Label TOGGLE # Is called once on input change
Move X down # X = the node's number
JMP ONE_STANDS
Label ONE_STANDS # is called as long as the input == 1
MOVE UP, ACC # Read input to ACC
# Note that ACC is now 0, should we jump to ZERO
MOVE 0, down # whether input is 0 or 1, we don't send X in this case
JMP ZERO # if ACC == 0
JMP ONE_STANDS # if ACC != 0通过在每个循环中总是发送一个0或一个1-4,我们现在可以使用并行处理的能力了!在middel行处理器上,将最外层的管道分流到中间的两个,然后使用
MOV UP, ACC
ADD[LEFT/RIGHT]
MOV ACC, DOWN对中断进行总结。重复下面一行的两个和,MOV下降。
尝试并构建此代码;如果您愿意,我可以发布顶级节点的实际代码。
https://codereview.stackexchange.com/questions/98888
复制相似问题