我有一个数字1f存储在address 00,另一个数字1e存储在address 01。现在我想把1f变成1f00,把1e变成001e,然后将它们相加以获得1f1e。我该怎么做?我知道asl和lsr处理这个问题的指令,但是我是个6502的初学者,所以我很感激有人能告诉我它是如何高效地完成的(最少的周期)。
发布于 2014-10-30 17:02:48
如果使用16位数量,则需要确保变量为16位,或2字节宽。
您可能希望使用6502小端点顺序,特别是如果您的变量可以用作地址的话。这意味着低字节,高字节顺序。
我有一个号码1f存储在地址00,我有另一个号码1e存储在地址01。
你真的想让001F存储在地址$00-$01 ($00等于$1F,$01等于#$00),$001 E存储在地址$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)
如果是的话,他们是unsigned ,只有LDA #$00, STA VAR_A_16, STA VAR_B_16, LDA $00, >STA VAR_A_16, LDA $01, STA >VAR_B_16。
>是一种通用的汇编程序语法,意思是“低字节”(实际上可能是< --我一直对此感到困惑)
如果8位值为负值(位7集),则需要在新字节中存储signed,否则要存储$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发布于 2014-10-13 20:48:27
6502是一台8位机器;它通过从较低地址(即小endian)读取最小有效字节来构造16位数量。
因此,您只需将1e放在1f之前的地址中--通过相对于当前布局,通过将1f移动到address 02或通过其他方式将它们切换。不需要移位或ORing;实际上,在6502中没有可以用位逻辑移位或操作的16位寄存器。
如果这两个字节保持在00和01,但相反,那么您可以例如零出x,并使用($00, x)寻址模式访问1f1e。
https://stackoverflow.com/questions/26224423
复制相似问题