Assembly 6502装配移位钻头
我有一个编号Assembly 6502装配移位钻头,assembly,6502,Assembly,6502,我有一个编号1f存储在地址00,还有一个编号1e存储在地址01。现在我想把1f变成1f00和1e变成001e,然后把它们相加得到1f1e。我该怎么做?我知道asl和lsr的说明可以解决这个问题,但我是6502初学者,因此我非常感谢有人能告诉我如何高效地完成(最少的周期) 6502是一台8位机器;它通过从低位地址读取最低有效字节(即小端字节)来构造16位量 因此,您只需将1e放在1f之前的地址中,方法是将它们相对于当前布局进行切换,将1f移动到02地址或通过其他方式。无需移位或O形圈;实际上,65
1f
存储在地址00
,还有一个编号1e
存储在地址01
。现在我想把1f
变成1f00
和1e
变成001e
,然后把它们相加得到1f1e
。我该怎么做?我知道asl和lsr的说明可以解决这个问题,但我是6502初学者,因此我非常感谢有人能告诉我如何高效地完成(最少的周期) 6502是一台8位机器;它通过从低位地址读取最低有效字节(即小端字节)来构造16位量
因此,您只需将1e
放在1f
之前的地址中,方法是将它们相对于当前布局进行切换,将1f
移动到02
地址或通过其他方式。无需移位或O形圈;实际上,6502内部没有16位寄存器可以通过位逻辑进行移位或操作
如果这两个字节保持在
00
和01
但反向,则您可以将x
归零,并使用($00,x)
寻址模式访问1f1e
如果使用16位量,则需要确保变量为16位或2字节宽
您可能希望使用6502小端顺序,尤其是当您的变量可以用作地址时。这意味着低字节,高字节顺序
我有一个数字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\u A\u 8
)
$01-第二个8位变量(标签VAR\u B\u 8
)
$02-$03-要将第一个转换的8位变量放置在何处(标签VAR\u A\u 16
)
$04-$05-要将第二个转换的8位变量(标签VAR_B_16
)放置在何处
他们没有签名吗?如果是,只要LDA#00,STA VAR#u 16,STA VAR_B_16,LDA$00,>STA VAR_A_16,LDA$01,STA>VAR_B_16
是一种常见的汇编程序语法,意思是“低字节的”(它实际上可能是,因为6502是一台8位机器,您不能直接处理16位数字。您只需分别操作这两部分,不需要移位。@Jester您的意思是,如果我想将某些内容存储到1f1e
中,我需要使用sta吗($00),y
?是的,但请记住6502是小尾数,因此要获得1f1e
,您需要交换两个字节。当然,您也可以使用sta($00,x)
假设x
为零。@Jester如果我是你的话,我会把它提升为一个答案;它清楚地回答了这个问题,并且对将来发现这个问题的人来说会更加突出。如果不行,我想其他人可以将它发布为社区维基。
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