我有一个号码1f
存储在 address 00
,我有另一个号码1e
存储在 address 01
。现在我想把1f
into1f00
和1e
into 001e
,然后把它们加起来得到1f1e
。我该怎么做呢?我知道说明asl
并lsr
处理这个问题,但我是 6502 初学者,所以我真的很感激有人能告诉我它是如何有效地完成的(最少的周期)。
2 回答
如果您使用 16 位数量,则需要确保您的变量是 16 位或 2 字节宽。
您可能想要使用 6502 little-endian 顺序,尤其是当您的变量可以用作地址时。这意味着低字节,高字节顺序。
我有一个数字 1f 存储在地址 00,我有另一个数字 1e 存储在地址 01。
您确实希望将 $001F 存储在地址 $00-$01 ($00 将等于 #$1F 和 $01 将等于 #$00),并将 $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
。
这>
是一种常见的汇编语法,表示“低字节”(实际上可能<
是- 我总是对此感到困惑)
他们签了吗?如果 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
6502是8位机;它通过从低地址读取最低有效字节(即它是小端)来构造 16 位数量。
因此,您只需在1e
之前将它们放入一个地址1f
- 通过将它们与您当前的布局进行切换,通过移动1f
到地址02
或通过其他方式。不需要移位或 ORing;确实,6502 内部没有可以使用按位逻辑进行移位或操作的 16 位寄存器。
如果这两个字节保持不变但相反,那么您可以例如归零00
并使用寻址模式来访问。01
x
($00, x)
1f1e