6502装配移位

时间:2014-10-06 20:33:49

标签: assembly 6502

我在地址1f存储了一个00号码,我在地址1e存储了另一个号码01。现在,我想将1f变为1f00,将1e变为001e,然后将其添加到1f1e。我该怎么做呢?我知道说明asllsr处理这个问题,但我是6502初学者,所以我真的很感激有人可以告诉我它是如何有效地完成的(最少量的循环)。

2 个答案:

答案 0 :(得分:2)

如果您使用的是16位数量,则需要确保变量为16位或2字节宽。

您可能希望使用6502 little-endian顺序,尤其是如果您的变量可以用作地址。这意味着低字节,高字节顺序。

  

我在地址00处存储了一个数字1f,并且我在地址01处存储了另一个数字1e。

你真的希望在地址$ 00- $ 01($ 00等于#$ 1F和$ 01等于#$ 00)存储$ 001F,$ 001E存储在地址$ 02- $ 03($ 02等于#$ 1E和$ 03将等于#$ 00)。然后你可能想要另一个变量来保存结果,让我们说$ 04- $ 05。


但是,如果你真的有两个8位变量而你想要"转换"它们是16位变量......

假设(为清晰起见使用标签):

$ 00 - 您的第一个8位变量(标签VAR_A_8

$ 01 - 您的第二个8位变量(标签VAR_B_8

$ 02- $ 03 - 您要放置第一个转换的8位变量(标签VAR_A_16

$ 04- $ 05 - 您要放置第二个转换的8位变量(标签VAR_B_16

他们未签名吗?如果是,只需LDA #$00, STA VAR_A_16, STA VAR_B_16, LDA $00, >STA VAR_A_16, LDA $01, STA >VAR_B_16

>是一种常见的汇编语法,意思是&#34;低字节&#34; (可能实际上是< - 我总是对此感到困惑)

他们签名吗?如果8位值为负(第7位设置),您希望在新字节中存储$ FF,否则您希望存储$ 00。

一种方式:

               LDX #$00
               LDA VAR_A_8       ;Loading .A will set N flag in .P if bit 7 is set
               BPL VAR_A_NOT_NEG
               DEX               ;.X will now be $FF
VAR_A_NOT_NEG: STX <VAR_A_16     ;store .X in high byte
               STA >VAR_A_16     ;copy low byte
               LDX #$00
               LDA VAR_B_8
               BPL VAR_B_NOT_NEG
               DEX
VAR_B_NOT_NEG: STX <VAR_B_16
               STA >VAR_B_16

答案 1 :(得分:1)

6502是一台8位机器;它通过从较低地址读取最低有效字节来构造16位数量(即它是小端)。

因此,您只需将1e放入1f之前的地址 - 通过将1f移至地址02或通过其他一些手段。不需要移位或ORing;事实上,6502内部没有16位寄存器可以通过按位逻辑进行移位或操作。

如果两个字节保持在0001但是相反,那么您可以例如将x归零并使用($00, x)寻址模式访问1f1e