assembly - 是否有逻辑算法为给定的输入生成唯一的输出?

标签 assembly 6502

我有一个需要输出唯一格式化字节的输入表。从算法输出的字节只需打开 1 位,即可提供 8 个独特的输出。只要每个输入都有唯一的输出,输入就不必与特定的输出相关联。以下是所有可能的输入和输出的列表。

输入: -00001000 -00001001 -00000001 -00000101 -00000100 -00000110 -00000010 -00001010

输出: -10000000 -01000000 -00100000 -00010000 -00001000 -00000100 -00000010 -00000001

我想知道是否有设计用于执行此操作的逻辑算法。我目前正在为此使用一个不是很优化的查找表。我可以访问 6502 汇编中使用的所有操作。

我已将我的查找表代码作为答案中的一种可能解决方案,但我正在寻找更好的东西(如果存在的话)。

最佳答案

18字节,11个周期

一个小的查找表将是最小、最快的,并且不要忘记最通用的问题解决方案。您可以轻松更改这些数字相互映射的方式。

LDX input     ;  2 bytes, 3 cycles (Zero Page)
LDA lookup,X  ;  3 bytes, 5 cycles
STA output    ;  2 bytes, 3 cycles (Zero Page)

lookup:       ; 11 bytes
  .byte $00,$20,$02,$00,$08,$10,$04,$00,$80,$40,$01

提示:查找表的第一个字节 ($00) 可能会兼作程序中所需的某个字符串的终止零。这是多年来我不止一次使用过的一个技巧。

18字节,10个周期

通过绝对确保查找表不跨越页面边界来减少 1 个周期(5 个周期然后变成 4 个周期)。

LDX input     ;  2 bytes, 3 cycles (Zero Page)
LDA lookup,X  ;  3 bytes, 4 cycles
STA output    ;  2 bytes, 3 cycles (Zero Page)

lookup:       ; 11 bytes
  .byte $00,$20,$02,$00,$08,$10,$04,$00,$80,$40,$01

17 个字节,10 个周期

通过将查找表放在零页上(3 个字节然后变成 2 个字节)来减少 1 个字节和 1 个周期。

LDX input     ;  2 bytes, 3 cycles (Zero Page)
LDA lookup,X  ;  2 bytes, 4 cycles (Zero Page)
STA output    ;  2 bytes, 3 cycles (Zero Page)

lookup:       ; 11 bytes
  .byte $00,$20,$02,$00,$08,$10,$04,$00,$80,$40,$01

关于assembly - 是否有逻辑算法为给定的输入生成唯一的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72841592/

相关文章:

architecture - ESP在 assembly 中是什么意思?

c - 在 x86 汇编方面需要一些帮助

assembly - 将#$FF 加载到 A,并存储在地址 $0000 不起作用

c - 如何从 C 中的汇编代码打印整数值

optimization - 将小数加载到 64 位 x86 寄存器中

assembly - 在汇编中添加两个 64 位数字

linux - 在 i386 Linux 上的汇编中提高 BRK

assembly - 6502 相对地址模式换行

c - 有没有办法从C文件中调用6502汇编代码?