3

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

n00bish问题在这里!

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

.db、DB、.byte 等列出了您指定的确切字节,作为数据而不是指令 ( http://forum.6502.org/viewtopic.php?f=2&t=2374 )

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

.byte:定义字节大小的数据。后面必须跟一系列(字节范围)表达式或字符串。

例子:

        .byte   "Hello "
        .byt    "world", $0D, $00

( http://www.cc65.org/doc/ca65-11.html )

我不知道那是什么意思。我认为所有与定义数据相关的操作都是读写内存地址的变体。所以像这样的东西(来自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

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

4

2 回答 2

2

这里有两件不同的事情需要考虑。您正在混合 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 标头格式的字节,该格式始终为 16 个字节长。这些字节既不是 ROM 也不是 RAM 的一部分,而只是在 PC 上存储 NES ROM 的标头约定。

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

我希望这会有所帮助。

于 2015-03-02T09:03:14.270 回答
1

阅读评论后,我尝试给出答案:

在大多数计算机的内存中,所有类型的数据(包括代码)都以字节的形式存储。

这意味着汇编程序最终必须将所有指令转换为字节。

指令“LDA $1234”将存储为三个字节:$AD、$12 和 $34。

使用指令“.byte”、“.word”和“.long”(可能是 6502 不支持“.long”),您可以直接指示汇编器将一些给定的字节放入某个内存位置,而不是代表的字节一些指示。

想象一下作为操作系统一部分的以下代码:

LDX $2000
STA 0,X
...
JSR $2001

在这种情况下,地址 $2000 处的字节将包含零页中的地址,A 寄存器将写入该地址,而地址 $2001 处的字节是实际代码的第一个字节。

从地址 $2000 开始的数据的汇编代码现在可能如下所示:

# Zero-page address where the OS will store the A register
.byte $12
# Actual code called by the OS
LDA $12
...
RTS

我希望这有帮助。

- - 编辑 - -

关于您使用 '.ascii "iNES"' 行的示例:

这些行只出现在 NES 仿真器的程序中,而不出现在真正的 NES 设备的程序中。

当使用术语“操作系统”的非常非常广泛的定义时,您可能会说 NES 模拟器是某种“操作系统”。在这种情况下,示例中“.byte”行的原因与上述相同:

“操作系统”(= NES 模拟器)将读取文件的前 16 个字节,检查这些字节,对这些字节做一些事情,然后实际运行代码。

您可能还看到了代码中的以下几行:

.advance $FFFA
.word vblank, reset, irq

这两行也不是 6502 汇编器指令,但它们是对汇编器的指令:

它们指示汇编器写入六个特殊字节来寻址 $FFFA。这是必要的,因为 6502 CPU 需要六个字节,代表地址 $FFFA-$FFFF 处的三个特殊地址。

于 2015-03-02T06:19:18.350 回答