首先:对不起,如果这是一个骗局!我已经搜索了一点,但没有找到令人满意地解释这一点的资源。

这里有n00bish问题!

我试图了解 .byte 指令的作用。不同的消息来源说不同的事情,其要点是:



cc65 手册给出了类似的含糊:



我不知道那是什么意思。我认为所有与定义数据相关的操作都是读取和写入内存地址的变化。所以像这样(来自对 NES 开发的 tut)

; Number of PRG-ROM blocks
.byte $01
; Number of CHR-ROM blocks
.byte $01
; ROM control bytes: Horizontal mirroring, no SRAM
; or trainer, Mapper #0
.byte $00, $00

它究竟在做什么?这一切都可以用操作码来解释,还是做一些更有趣的事情?对我来说,它看起来可能是从零页开始写入顺序数据,像这样??:
LDA #$01
STA $00
LDA #$01
STA $01
LDA #$00
STA $02
LDA #$00
STA $03

我离这儿很远吗?我一直在阅读 6502 Software Design by Leo Scanlon 并且我没有看到对该(或任何)指令的引用。我正在学习 6502 以进行 NES 开发,所有示例代码都充斥着 .byte.ascii 和其他几个指令。在尝试浏览用户贡献的 NES 教程的世界之前,我真的很想尝试从像 Scanlon 这样的学术文本中获得 6502 的坚实基础,但这正成为我理解 NES 6502 的障碍。

最佳答案

这里有两件不同的事情需要考虑。您正在混合 ROM 内存位置,其中值总是在这里(它们不能也不应该“加载”)和 RAM,其中内容在系统开机时未定义,以及任何您想要使用的数据必须在某个时候有效地“加载”。

例如 :

.byte $00, $01, $02, $03

将在 ROM 中的某处添加这 4 个字节。它们不是“加载”的,它们总是在这里。

与:
ldx #$00
stx somewhere
inx
stx somewhere+1
inx
stx somewhere+2
inx
stx somewhere+3

如果某处指向 RAM,那么这将在此位置加载字节 $00、$01、$02、$03。这些字节仅在您加载这些值后才位于 RAM 位置,直到您用其他值覆盖 RAM。

现在,对于您的示例,这实际上是一个令人困惑的示例,因为它定义了 iNES header 格式的字节,该格式始终为 16 个字节长。 这些字节既不属于 ROM 也不属于 RAM,而只是用于在 PC 上存储 NES ROM 的 header 约定。

您看到的示例只是诱使汇编器认为 header 是 ROM 的一部分,而实际上并非如此。这只是其中一种方法。另一种方法是使用汇编器生成一个干净的“原始”ROM 镜像,并在构建时单独添加 iNES 头文件,这就是我个人的做法。

我希望这有帮助。

关于assembly - byte 指令在 6502 汇编器中的作用是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28803143/

10-12 17:12