LDA / ROL / STA - 说明解释

时间:2017-02-07 08:38:32

标签: 6502

有人可以解释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

这是正确的,解释?

2 个答案:

答案 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)

汤姆给出了很好的描述。我想补充说,有些汇编程序使用“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

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

复制上面的反汇编并将其粘贴到here。单击“Assemble”,选中“Debugger”复选框,然后单击“Step”。该网页是一本电子书,教您使用内置模拟器进行6502编程。

或者this simulator here也不错。

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

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