有人能解释一下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这是正确的解释吗?
发布于 2017-02-07 14:48:58
我不太理解清单,但说明如下:
LDA #$08将$08加载到累加器中,根据加载的值设置N和Z标志。
ROL A旋转累加器左1位,将旧进位标志放入0位,将旧位7放入进位标志。08美元左移1位是10美元,因为进位标志是1,结束值是11美元(N和Z标志也是根据新结果设置的)。
STA $10将累加器的值存储在地址$10的内存中,使累加器保持不变。旗子不受影响。
(写一些类似于LoaD LDA A #$08的东西并不常见--A涉及的事实是从助记符中知道的,LDA是LDA A #$08 Accumulator的缩写。另一方面,ROL A是这样写的,因为ROL也可以访问内存。以现代标准来看,6502汇编语言语法并不完全一致。)
org有一些很好的参考资料,例如http://www.6502.org/tutorials/。如果您已经在其他系统上完成了汇编语言编程,那么最好只从阅读的数据表中进行编程。
发布于 2017-02-08 05:53:14
汤姆描述得很好。我要补充的是,有些汇编程序使用"A“来对累加器进行操作(例如ROL),而有些则不使用(只是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是一个合理的选择,因为它很容易使用。
https://stackoverflow.com/questions/42085174
复制相似问题