美文网首页
6502芯片:编码算法(Coding Algorithms)

6502芯片:编码算法(Coding Algorithms)

作者: 苹果王子刘泽庆 | 来源:发表于2021-05-20 21:07 被阅读0次

我们前面介绍的6502指令集是非常基本的,只涉及简单的8位数据操作。而涉及到复杂数据操作,比如16位或32位的算术计算或内存数据传输,我们就需要将前面介绍的简单指令进行排列组合,形成一个指令代码段来完成任务。下面我们就开始探讨如何创建这些更加复杂的算法。

标准规范(Standard Conventions)

6502处理器期望地址以“小端序”顺序存储,最低有效字节在前,最高有效字节在后。如果存储的值只是一个数字(例如游戏得分,等等)然后我们可以编写代码来以“大端序”的顺序存储和操纵它如果我们希望,然而这里给出的算法总是使用“小端序”的秩序,这样他们可以被应用到简单的数值或地址没有修改。

“大端序”和“小端序”这两个术语来自《格列佛游记》。利力浦特人和不来夫斯古人一直在为应该把煮鸡蛋的哪一端弄破吃而打仗。在计算机术语中,它是指二进制数的最高有效部分或最低有效部分是否存储在较低的内存地址中。

为了安全起见,算法通常首先将处理器标志和寄存器设置为安全的初始值。如果需要从例程中挤出一些额外的字节或周期,则可以根据前面的指令删除其中一些初始化。

简单的内存操作(Simple Memory Operations)

最基本的内存操作大概就数清除一块内存区域并重新设置初始值了,比如置零。鉴于6502芯片无法直接将值移动到内存当中,即使仅清除一小块内存区域也需要用到寄存器。累加器(A)、X寄存器或者Y寄存器任一个都可以用来保存初始值,但是在实际应用中,我们通常使用累加器。这是因为累加器可以使用PHA和PLA这样的指令进行快速的存储和恢复,从而节省出X、Y寄存器的宝贵空间供程序使用。

; Clearing 16 bits of memory
_CLR16  LDA #0          ;Load constant zero into A
        STA MEM+0       ;Then clear the least significant byte
        STA MEM+1       ;... followed by the most significant

; Clearing 32 bits of memory
_CLR32  LDA #0          ;Load constant zero into A
        STA MEM+0       ;Clear from the least significant byte
        STA MEM+1       ;... up
        STA MEM+2       ;... to
        STA MEM+3       ;... the most significant

移动少量的数据需要一个寄存器在传输过程中充当临时容器。同样,可以使用A、X或Y中的任何一个,但与之前一样,使用A作为临时寄存器通常是最实用的。

; Moving 16 bits of memory
_XFR16  LDA SRC+0       ;Move the least significant byte
        STA DST+0
        LDA SRC+1       ;Then the most significant
        STA DST+1

; Moving 32 bits of memory
_XFR32  LDA SRC+0       ;Move from least significant byte
        STA DST+0
        LDA SRC+1       ;... up
        STA DST+1
        LDA SRC+2       ;... to
        STA DST+2
        LDA SRC+3       ;... the most significant
        STA DST+3

如果源和目标区域不重叠,那么字节移动的顺序是不相关的,但是在你的方法中保持一致通常会让错误更容易被发现。

前面的所有示例都可以扩展以应用于更大的内存区域,但是随着所涉及的字节数的增长,将生成越来越大的代码。使用计数器迭代并使用索引寻址来访问内存的算法将导致更小的代码,但执行速度会稍微慢一些。

对于汇编语言而言,在程序的执行速度和体积大小之间进行权衡是十分常见的。很多时候将这个天平明显倾向一端会明显优于另一端,比如:当你绞尽脑汁想把一堆代码塞进一个容量被严格限定的ROM中时,必须优先选择控制程序大小;但是当你希望在一段视频闪烁期间快速处理数据,那必须毫不犹豫优先选择速度。

; Clear 32 bits of memory iteratively
_CLR32C LDX #3
        LDA #0
_LOOP   STA MEM,X
        DEX
        BPL _LOOP

; Move 32 bits of memory iteratively
_XFR32C LDX #3
_LOOP   LDA SRC,X
        STA DST,X
        DEX
        BPL _LOOP

另一个常见的基本操作是将16位数据设置为初始常数值。最简单的方法就是把16位数据分为高8位、低8位两部分,然后分别存入累加器(A)中,然后再存入内存中。

; Setting a 16 bit constant
_SET16I LDA #LO NUM     ;Set the least significant byte of the constant
        STA MEM+0
        LDA #HI NUM     ;... then the most significant byte
        STA MEM+1

相关文章

网友评论

      本文标题:6502芯片:编码算法(Coding Algorithms)

      本文链接:https://www.haomeiwen.com/subject/yzbhjltx.html