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 是一个合理的选择,因为它非常易于使用。
有人可以解释一下 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 是一个合理的选择,因为它非常易于使用。