参考:https://zhuanlan.zhihu.com/p/613188641
题目说明:
网络从网络上的另一台计算机接收数据,并在屏幕上显示它。有效载荷将是宽度为 16 像素的图像。有关所使用的网络协议的详细信息,请参阅关卡帮助。网络线被内存映射到地址 6001(十六进制),具有两个重要位:数据(位 0),表示发送到线上的当前位数据,和同步(位 1),在新位到达时发生变化。注意:仅使用汇编语言解决这个问题可能会有挑战。您可能希望先实现堆栈操作宏,然后再返回到这个挑战,这样您就可以使用它们来简化代码。网络将信息作为一系列比特进行传输。在铜线中,一个电流超过某个水平可能表示 1,而没有电流(或低于某个阈值的电流)表示 0。光纤使用光信号,其中光表示 1,而无光表示 0。同步
这引发了一个问题,即如何知道一个比特何时结束,下一个比特何时开始。两个连续的 1 与单个持续时间较长的 1 是无法区分的。因此,网络协议需要一些定时机制来确定比特何时结束。一个常见的解决方案是一个被所有参与方共享的约定的网络时钟。这需要高精度,因为一方稍微偏离同步就会破坏所有数据。另一种选择是一个同步的网络,其中网络本身携带同步信号。这需要更多的带宽,但实现起来更简单。在本任务中,我们使用具有两根线的同步连接。一根线传输数据,另一根传输同步信号。每当同步信号发生变化(从 0 到 1 或从 1 到 0),就可以从数据线读取一个新比特。这需要两倍的带宽,但实现起来更简单。消息格式
下一个问题是如何确定数据传输何时开始和结束。如果信号为 0 的情况与无传输相同,那么就无法知道另一端是否正在传输 0,因此无法确定传输是否已经结束!因此,协议(在本任务中)是传输始终以 1 位开始,后跟 16 位数据,然后是控制位。如果控制位为 0,则表示传输已经结束。如果控制位为 1,则表示将跟随另外 16 位数据,再次后跟控制位。依此类推。带宽
网络比特率必须足够慢,以便处理器可以接收和处理每个比特。实际上,网络比特率通常比处理器慢得多在这个模拟中,网络比特率比处理器时钟速率慢 100 倍,即程序可以在每个网络比特上执行 100 条指令。
帮助信息中提示:先实现堆栈操作宏
以下代码来自于参考:https://zhuanlan.zhihu.com/p/613188641
待了解
DEFINE LS 0x0010
DEFINE CC 0x0011
DEFINE CD 0x0012INIT_STACK
PUSH_VALUE 0x4000# Waiting for a new bit
LOOP1:
A = 0x6001
D = *A - 1
A = L1C1
D; JGT
D = 0
A = CTL1
JMP
L1C1:
D = 1
CTL1:
A = LS
A = *A
D = D - A
A = LOOP2
D; JNE
A = LOOP1
JMP# Checking if a new content
LOOP2:
A = LS
D = *A
A = L2C1
D; JGT
A = LS
*A = 1
A = CTL2
JMP
L2C1:
A = LS
*A = 0
CTL2:
A = CD
D = *A
A = LOOP3
D; JGT
A = 0x6001
D = *A
A = 1
D = D & A
A = 0x7fff
D; JEQ
A = CD
*A = 1
A = LOOP1
JMP# Merging bits
LOOP3:
A = 16
D = D - A
A = L3C1
D; JLT
A = CD
*A = 0
A = LOOP4
D; JMP
L3C1:
A = CC
D = *A
D = D + *A
PUSH_D
A = 0x6001
D = *A
A = 1
D = D & A
POP_A
D = D + A
A = CC
*A = D
A = CD
*A = *A + 1
A = LOOP1
JMP# Sending content
LOOP4:
A = CC
D = *A
*A = 0
POP_A
*A = D
D = A
PUSH_D
PUSH_VALUE 0x0020
ADD
A = LOOP1
JMP