LDA / ROL / STA - 指令解释

LDA / ROL / STA - Instructions explanations

有人可以解释一下 LDA、ROL、STA 给出的每条指令的确切结果吗?

C=1 (carry flag is 1)

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

我是这样想的:

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

解释正确吗?

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

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

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

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

(写LDA A #这样的东西并不常见——从助记符可以知道涉及A的事实,LDA是Loa[=29的缩写=]D Accumulator.ROL A,反之,这样写是因为ROL也可以访问内存.6502汇编语言语法与现代标准不太一致。)

6502.org 有一些很好的参考 material - 例如,http://www.6502.org/tutorials/. If you've done assembly language programming on other systems you'll probably be good to go just from the data sheet from, e.g., https://en.wikipedia.org/wiki/MOS_Technology_6502#Further_reading.

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

所以这是一个注释反汇编:

SEC      ;I added this to set C=1
LDA # ;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   ;Stores A into memory address , so =11

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

复制上面的反汇编并粘贴到here。单击 "Assemble",选中 "Debugger" 复选框并单击 "Step"。该网页是一本教您使用 built-in 模拟器进行 6502 编程的电子书。

或者this simulator here也不错。

Clicking this link 会将您的程序加载到更高级的模拟器中,该模拟器会显示每个周期。

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