我在地址1f
存储了一个00
号码,我在地址1e
存储了另一个号码01
。现在,我想将1f
变为1f00
,将1e
变为001e
,然后将其添加到1f1e
。我该怎么做呢?我知道说明asl
和lsr
处理这个问题,但我是6502初学者,所以我真的很感激有人可以告诉我它是如何有效地完成的(最少量的循环)。
答案 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位寄存器可以通过按位逻辑进行移位或操作。
如果两个字节保持在00
和01
但是相反,那么您可以例如将x
归零并使用($00, x)
寻址模式访问1f1e
。