有人可以解释LDA,ROL,STA给出结果的每条指令的确切结果吗?
package main
import (
"fmt"
"sync"
)
func main() {
c := make(chan int, 2)
var wg sync.WaitGroup
wg.Add(2)
go doSomething(c, wg)
go doSomething(c, wg)
go doSomething(c, wg)
wg.Wait()
close(c)
for v := range c {
fmt.Print(v)
}
}
func doSomething(c chan<- int, wg sync.WaitGroup) {
defer wg.Done()
c <- 1
}
我想到了这个:
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
这是正确的,解释?
答案 0 :(得分: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 o D 的缩写另一方面,一个 ccumulator。ROL A
是这样编写的,因为ROL
也可以访问内存.6502汇编语言语法与现代标准不太一致。 )
6502.org有一些很好的参考资料 - 例如http://www.6502.org/tutorials/。如果您已经在其他系统上进行了汇编语言编程,那么您可能只需从数据表中获取,例如https://en.wikipedia.org/wiki/MOS_Technology_6502#Further_reading。
答案 1 :(得分:1)
所以这是一个评论反汇编:
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
您可以在具有调试器的各种模拟器或仿真器中测试您的程序 - 只需单步执行并观察每条指令的效果。这是最好的学习方式。
复制上面的反汇编并将其粘贴到here。单击“Assemble”,选中“Debugger”复选框,然后单击“Step”。该网页是一本电子书,教您使用内置模拟器进行6502编程。
或者this simulator here也不错。
Clicking this link会将您的程序加载到更高级的模拟器中,该模拟器会显示每个周期。
当然还有许多其他可下载的旧计算机模拟器,您可以在命令行上进行交互以进入程序集,然后使用模拟器对其进行调试。这需要更多的学习,但可能是值得的。例如。 AppleWin是一个合理的选择,因为它很容易使用。