如何缩短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 类型结构中。