如何缩短MARIE中将信息字转换为汉明码的代码
How to shorten the code to convert information word to hamming code in MARIE
我制作了一个 MARIE 代码,它接受 8 个信息位的输入并将其转换为 12 位汉明代码。如何缩短这段代码?我对每个奇偶校验位使用相同的异或函数,每个奇偶校验位的值不同。
我首先在一个循环中获取 8 位的输入并将其存储在不同的地址,如数组。然后,我找到不同奇偶校验位的异或(事先知道位置)并替换主信息字中的奇偶校验位(使用每个位置的地址)。终于给了一个海明码的输出。
我已经发布了下面的代码:
'''
ORG 100
getInput, LoadI data
Skipcond 000
Input
Store temp
LoadI data
Skipcond 000
Load temp
StoreI data
Load data
Add one
Store data
Clear
Load size
Subt one
Store size
Skipcond 400
Jump getInput
Load dataTop
Add two
Store data
Load sizeMax
Store size
p1loop, LoadI data
Add p1
Store p1
Load data
Add two
Store data
Load size
Subt two
Store size
Skipcond 400
Jump p1loop
XOR, Load p1
Subt two
Store p1
Skipcond 000
Jump XOR
Add two
Store p1
Load dataTop
Store data
Load p1
StoreI data
Load dataTop
Add two
Store data
LoadI data
Store p2
Load sizeMax
Subt 2
Store size
p2loop, Load data
Add three
Store data
LoadI data
Add p2
Store p2
Load data
Add one
Store data
LoadI data
Add p2
Store p2
Load size
Subt four
Store size
Skipcond 400
Jump p2loop
XOR2, Load p2
Subt two
Store p2
Skipcond 000
Jump XOR2
Add two
Store p2
Load dataTop
Add one
Store data
Load p2
StoreI data
Load dataTop
Add four
Store data
Load three
Store size
p3loop, LoadI data
Add p3
Store p3
Load data
Add one
Store data
Load size
Subt one
Store size
Skipcond 400
Jump p3loop
Load dataTop
Add eleven
Store data
LoadI data
Add p3
Store p3
XOR3, Load p3
Subt two
Store p3
Skipcond 000
Jump XOR3
Add two
Store p3
Load dataTop
Add three
Store data
Load p3
StoreI data
Load dataTop
Add eight
Store data
Load eight
Store size
p4loop, LoadI data
Add p4
Store p4
Load data
Add one
Store data
Load size
Subt one
Store size
Skipcond 400
Jump p4loop
XOR4, Load p4
Subt two
Store p4
Skipcond 000
Jump XOR4
Add two
Store p4
Load dataTop
Add seven
Store data
Load p4
StoreI data
Load dataTop
Store data
Load sizeMax
Store size
ShowOutput, Clear
LoadI data
Output
Load data
Add one
Store data
Clear
Load size
Subt one
Store size
Skipcond 400
Jump ShowOutput
Halt
one, DEC 1
two, DEC 2
three, DEC 3
four, DEC 4
seven, DEC 7
eight, DEC 8
eleven, DEC 11
p1, DEC 0
p2, DEC 0
p3, DEC 0
p4, DEC 0
sizeMax, DEC 12
size, DEC 12
dataTop, HEX 1B0
temp, DEC 0
data, HEX 1B0
DEC -1
DEC -1
DEC 1
DEC -1
DEC 1
DEC 1
DEC 1
DEC -1
DEC 1
DEC 1
DEC 1
DEC 1
'''
一些小点:
XOR4, Load p4
Subt two
Store p4
Skipcond 000
Jump XOR4
Add two
Store p4
不需要在循环中同时加载和存储 p4,所以这也可行:
Load p4
XOR4,
Subt two
Skipcond 000
Jump XOR4
Add two
Store p4
还有一点,您实际上并不需要 p2 到 p4,因为当代码使用 p1
完成后,它再也不会使用它,而是切换到 p2
,以此结束然后继续 p3
。 p2 到 p4 的唯一好处是它们被初始化为 0。因此,只要在循环之前将其清除,代码就可以在任何地方只使用 p1。
我之所以提到这一点,是因为使代码更小的一种方法是为所有 4 个循环操作共享相同的代码。这将需要一些抽象,删除不必要的变量可以帮助解决这个问题。
否则,除了它们使用的常量外,大多数不同的循环读取相同。因此,也许将常量放在 table 中,然后围绕共享代码进行外部循环,使其运行 4 次,使用来自 table.
的不同常量
这 4 个循环确实有一些其他差异,也许这些差异也可以从 table 中选择,或者可能通过测试外部循环变量,在内部循环的一些 if-then 类型结构中。
我制作了一个 MARIE 代码,它接受 8 个信息位的输入并将其转换为 12 位汉明代码。如何缩短这段代码?我对每个奇偶校验位使用相同的异或函数,每个奇偶校验位的值不同。 我首先在一个循环中获取 8 位的输入并将其存储在不同的地址,如数组。然后,我找到不同奇偶校验位的异或(事先知道位置)并替换主信息字中的奇偶校验位(使用每个位置的地址)。终于给了一个海明码的输出。
我已经发布了下面的代码:
'''
ORG 100
getInput, LoadI data
Skipcond 000
Input
Store temp
LoadI data
Skipcond 000
Load temp
StoreI data
Load data
Add one
Store data
Clear
Load size
Subt one
Store size
Skipcond 400
Jump getInput
Load dataTop
Add two
Store data
Load sizeMax
Store size
p1loop, LoadI data
Add p1
Store p1
Load data
Add two
Store data
Load size
Subt two
Store size
Skipcond 400
Jump p1loop
XOR, Load p1
Subt two
Store p1
Skipcond 000
Jump XOR
Add two
Store p1
Load dataTop
Store data
Load p1
StoreI data
Load dataTop
Add two
Store data
LoadI data
Store p2
Load sizeMax
Subt 2
Store size
p2loop, Load data
Add three
Store data
LoadI data
Add p2
Store p2
Load data
Add one
Store data
LoadI data
Add p2
Store p2
Load size
Subt four
Store size
Skipcond 400
Jump p2loop
XOR2, Load p2
Subt two
Store p2
Skipcond 000
Jump XOR2
Add two
Store p2
Load dataTop
Add one
Store data
Load p2
StoreI data
Load dataTop
Add four
Store data
Load three
Store size
p3loop, LoadI data
Add p3
Store p3
Load data
Add one
Store data
Load size
Subt one
Store size
Skipcond 400
Jump p3loop
Load dataTop
Add eleven
Store data
LoadI data
Add p3
Store p3
XOR3, Load p3
Subt two
Store p3
Skipcond 000
Jump XOR3
Add two
Store p3
Load dataTop
Add three
Store data
Load p3
StoreI data
Load dataTop
Add eight
Store data
Load eight
Store size
p4loop, LoadI data
Add p4
Store p4
Load data
Add one
Store data
Load size
Subt one
Store size
Skipcond 400
Jump p4loop
XOR4, Load p4
Subt two
Store p4
Skipcond 000
Jump XOR4
Add two
Store p4
Load dataTop
Add seven
Store data
Load p4
StoreI data
Load dataTop
Store data
Load sizeMax
Store size
ShowOutput, Clear
LoadI data
Output
Load data
Add one
Store data
Clear
Load size
Subt one
Store size
Skipcond 400
Jump ShowOutput
Halt
one, DEC 1
two, DEC 2
three, DEC 3
four, DEC 4
seven, DEC 7
eight, DEC 8
eleven, DEC 11
p1, DEC 0
p2, DEC 0
p3, DEC 0
p4, DEC 0
sizeMax, DEC 12
size, DEC 12
dataTop, HEX 1B0
temp, DEC 0
data, HEX 1B0
DEC -1
DEC -1
DEC 1
DEC -1
DEC 1
DEC 1
DEC 1
DEC -1
DEC 1
DEC 1
DEC 1
DEC 1
'''
一些小点:
XOR4, Load p4
Subt two
Store p4
Skipcond 000
Jump XOR4
Add two
Store p4
不需要在循环中同时加载和存储 p4,所以这也可行:
Load p4
XOR4,
Subt two
Skipcond 000
Jump XOR4
Add two
Store p4
还有一点,您实际上并不需要 p2 到 p4,因为当代码使用 p1
完成后,它再也不会使用它,而是切换到 p2
,以此结束然后继续 p3
。 p2 到 p4 的唯一好处是它们被初始化为 0。因此,只要在循环之前将其清除,代码就可以在任何地方只使用 p1。
我之所以提到这一点,是因为使代码更小的一种方法是为所有 4 个循环操作共享相同的代码。这将需要一些抽象,删除不必要的变量可以帮助解决这个问题。
否则,除了它们使用的常量外,大多数不同的循环读取相同。因此,也许将常量放在 table 中,然后围绕共享代码进行外部循环,使其运行 4 次,使用来自 table.
的不同常量这 4 个循环确实有一些其他差异,也许这些差异也可以从 table 中选择,或者可能通过测试外部循环变量,在内部循环的一些 if-then 类型结构中。