【发布时间】:2018-11-03 21:02:50
【问题描述】:
我是一名学习计算机科学的大一新生。在计算机工程领域,我们正在开发一个 Zilog Z80 8 位微处理器 (1MHz) 和一组需要使用面包板和电缆手动连接的组件。
连接部分并不让我担心,但我确实有关于我需要编写以使我的程序正常工作的汇编程序的问题(LED 行车灯,手动输入行为和频率)。
我已经阅读了手册并且知道可以使用的一组说明(仅限基本必需品)。首先,我并不是要尽可能地获得最干净、最好看的代码。不过不用担心,我稍后会美化它,因为我喜欢干净高效的代码。
目前,该程序似乎在模拟器中运行良好,因此语法似乎没问题。不过,我不确定如何解决某些逻辑问题。
该练习具有以下规格:
- 起始地址 RAM:E000h
- 输入端口 1:03h
- 输出端口 1:05h
- 端口的 I/O 映射
- 电路自动打开 (1),因此 LED 处于低电平有效 (0)
- 输入 2、3、4 改变 LED 移动行为
- 输入 5,6 改变 LED 闪烁频率
我已经使用ORG E000h 设置了起始地址,并使用MOV SP,FFFFh 初始化了堆栈指针。对于输入(三种不同类型的闪烁/运行,以及两种不同的频率,总共等于五个按钮),我创建了不同的标签。
我目前的问题是我不太确定如何正确输入物理输入 - IIRC,我需要通过使用 XOR 来指定一个位模式,所有内容都为 1 但所需的输入,这样我就可以使用我的程序中的信息。
但即使我确实知道它应该如何工作(至少我认为我知道),我还是无法完全理解软件实现。此外,我遇到了条件问题:按下一个开关将闪烁频率更改为 1/4 Hz,而按下另一个开关将其更改为 4Hz。在高级语言中,我只会在这里使用 IF/ELSE,但在这种情况下我不知道该怎么做 - 遗憾的是,该手册仅包含基本操作,所以我不知所措。
因此,我想我会碰碰运气并向社区寻求帮助。
对于那些感兴趣的人,我会发布我的代码。正如我已经提到的,这是非常基本的,但我暂时只需要它来完成工作。由于我不喜欢大量格式笨拙的代码,因此我发布了文件here。该文件是通过 GoogleDrive 托管的 *.txt。
感谢您的宝贵时间,祝您有愉快的一天!
[EDIT] 根据用户 Ruud Helderman 的输入,在帖子中添加了特定代码
[EDIT] 更新了 *.txt 文件中的代码 - 现在更简单、更高效
[EDIT] 使用 HTML 格式来突出显示帖子中的指令
具体代码sn-p:
blink: ;function: all LED blinking, activated via input[2]
MOV A,FFh
OUT 05h,A ;all LED out
CALL pause1 ;frequency 1/4Hz, activated via input[5]
MOV A,00h
OUT 05h,A ;all LED on
CALL pause1
JP blink ;jump back to begin of function
上述函数使用输入开关板上的不同特定物理开关改变 LED 行为(在这种情况下:闪烁)和频率,总共八个开关(1 到 8,非激活状态 = 1;使用开关 2 到 6) .我知道获取输入应该是小菜一碟 - 它应该只是使用位模式为 0 和恰好一个 1 的 XOR。
在尝试为我的问题寻找解决方案时,我在网上找到了不同的方法,例如使用 TEST 检查特定位置的位。不过,我的说明手册没有提及任何此类指令,作业本身也没有提及。
我很清楚这可能是一个微不足道的问题,也许我只是陷入了我通过过度思考自己创造的心理循环中,但目前我不知道该怎么做(尽管我可以看到地平线上的城堡——感谢卡夫卡!)。
非常感谢任何帮助。
【问题讨论】:
-
我可以理解您希望有人帮助您相处,但在 stackoverflow 中,一次问一个问题很重要。看来您主要关心的是按位测试;您可能想要编辑您的问题并专注于该问题。至于 if-then-else 结构,这对您来说应该不会太难,因为您之前已经使用过 JP 和 JPNZ。看看你的代码,我会说你到目前为止做得很好。只是不要在每个子程序开始时重置 SP;你正在扼杀你的退货地址。
-
非常感谢您的意见。我将相应地编辑我的问题。关于 SP 不必要的额外初始化,我必须承认我不知道它是如何结束的。无论如何,感谢您的提醒;我的导师不会喜欢这样的!
-
请注意,最好在问题中包含(相关部分)您的源代码,而不是链接到外部源。
-
再次感谢您。我将相应地编辑我的帖子,并将在以后的帖子中直接包含特定的代码 sn-ps。我只需要了解所有不同的格式选项,因为我不希望我的代码看起来很笨重。好吧,我想我得在相应的部分多花点时间了!