2

有人可以解释每条指令 LDA、ROL、STA 给出的结果到底是什么吗?

C=1 (carry flag is 1)

LDA A #$08 0008 | 01
ROL A      0009 | 02
STA A $10  000A | 03  // A result is $11
           000B | 04
           000C | 05

我想到了这个:

LDA A #$08 0008   - Store 0000 into memory
ROL A      0009   - Get a data 0x08 from accumulator 0000 0100 add carry +1 = 0000 1011
STA A $10  000A   - get a result 0000 1011 = $11

是否正确,解释?

4

2 回答 2

5

我不太了解清单,但说明如下:

LDA #$08将 $08 加载到累加器中,根据加载的值设置 N 和 Z 标志。

ROL A将累加器左移 1 位,将旧的进位标志放入第 0 位,将旧的第 7 位放入进位标志。$08 左移 1 位为 $10,由于进位标志为 1,所以最终值为 $11。(N 和 Z 标志也根据新结果设置。)

STA $10将累加器的值存储到地址 $10 的内存中,保持累加器不变。标志不受影响。

(通常不写类似的东西LDA A #$08- 从助记符中知道涉及 A 的事实,LDA 是L oa D A ccumulator 的缩写。ROL A另一方面,这样写是因为ROL也可以访问内存。6502 程序集语言语法与现代标准不太一致。)

6502.org 有一些很好的参考资料 - 例如,http ://www.6502.org/tutorials/ 。如果您已经在其他系统上完成了汇编语言编程,那么您可能会很好地从数据表中获取,例如https://en.wikipedia.org/wiki/MOS_Technology_6502#Further_reading

于 2017-02-07T14:48:58.937 回答
1

汤姆给出了很好的描述。我要补充一点,一些汇编器使用“A”对累加器进行操作(例如 ROL A),而有些则不使用(只是 ROL)。

所以这里有一个注释反汇编:

SEC      ;I added this to set C=1
LDA #$08 ;Loads immediate value 08 into A and sets status flags (as every instruction does)
ROL      ;Rotates (like a shift) A left through the carry, so C=0, A=0x11
STA $10  ;Stores A into memory address $10, so $10=11

您可以在具有调试器的各种模拟器或仿真器中测试您的程序 - 只需单步执行并观察每条指令的效果。这是最好的学习方式。

复制上面的反汇编并粘贴到这里。单击“组装”,选中“调试器”复选框,然后单击“步骤”。该网页是一本电子书,教您使用内置模拟器进行 6502 编程。

或者,这里的模拟器也不错。

单击此链接会将您的程序加载到更高级的模拟器中,该模拟器会显示每个周期。

当然还有很多其他可下载的旧电脑模拟器,你可以在命令行上交互进入程序集,然后使用模拟器调试它。这需要更多的学习,但可能是值得的。例如,AppleWin是一个合理的选择,因为它非常易于使用。

于 2017-02-08T05:53:14.397 回答