首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >装配中断处理程序

装配中断处理程序
EN

Code Review用户
提问于 2015-08-03 12:46:59
回答 2查看 566关注 0票数 2

- INTERRUPT HANDLER -

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

昨晚上床睡觉的时候我被困在这上面了。当然,就像任何优秀的程序员一样,睡觉是我完成大部分工作的时候。

我的主要目标是减少周期计数。如果上面的..。呃,图形..。有什么可参考的吗,看起来我的周期计数要少得多。次要的是减少指令计数(但不是以周期计数为代价)。我可以想象如何将其降低到7个节点,而不是9个节点,但我无法想象这也会提高程序的效率(就周期计数而言)。

那么,我如何在这里减少循环计数呢?

第1行,第1栏(IN.1)

代码语言:javascript
复制
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 START

第1行,第2(IN.2)栏

代码语言:javascript
复制
MOV UP, ACC
START:
 MOV 0, DOWN
 JEZ CHECK
 JNZ CONTINUE
CHECK:
 MOV UP, ACC
 JEZ START
 MOV 2, DOWN
CONTINUE:
 MOV UP, ACC
 JMP START

第1行,第3栏(IN.3)

代码语言:javascript
复制
MOV UP, ACC
START:
 MOV 0, DOWN
 JEZ CHECK
 JNZ CONTINUE
CHECK:
 MOV UP, ACC
 JEZ START
 MOV 3, DOWN
CONTINUE:
 MOV UP, ACC
 JMP START

第1行,第4栏(IN.4)

代码语言:javascript
复制
MOV UP, ACC
START:
 MOV 0, DOWN
 JEZ CHECK
 JNZ CONTINUE
CHECK:
 MOV UP, ACC
 JEZ START
 MOV 4, DOWN
CONTINUE:
 MOV UP, ACC
 JMP START

第2行,第1列

代码语言:javascript
复制
MOV UP, RIGHT

第2行,第2列

代码语言:javascript
复制
ADD LEFT
ADD UP
MOV ACC, RIGHT
MOV 0, ACC

第2行,第3列

代码语言:javascript
复制
ADD LEFT
ADD UP
ADD RIGHT
MOV ACC, DOWN
MOV 0, ACC

第2行,第4列

代码语言:javascript
复制
MOV UP, LEFT

第3行,第3列(OUT)

代码语言:javascript
复制
MOV ANY, DOWN
EN

回答 2

Code Review用户

发布于 2015-08-03 13:52:06

您可以交换JEZ和JNZ,然后删除noop跳转以检查,而且因为开始前的指令与JMP之前的指令相同,所以可以删除以下两个指令:

代码语言:javascript
复制
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个值,而是让其他节点帮助收集它们。

票数 3
EN

Code Review用户

发布于 2015-08-04 18:40:41

我在顶部有三个部分的节点中有代码。假的:

代码语言:javascript
复制
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行处理器上,将最外层的管道分流到中间的两个,然后使用

代码语言:javascript
复制
MOV UP, ACC
ADD[LEFT/RIGHT]
MOV ACC, DOWN

对中断进行总结。重复下面一行的两个和,MOV下降。

尝试并构建此代码;如果您愿意,我可以发布顶级节点的实际代码。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/98888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档