2

我目前正在从事一个组装项目(MASM 与 Dosbox 结合),该项目基本上是为了教育目的重新创建 pong。我写了一个函数来将精灵(字节数组)绘制到视频内存(模式 13h),但是这些精灵开始弄乱文件的上半部分(因为它们可能非常大,我更喜欢这些大的艺术价值字节数组与从位图绘制相比)

我真的不知道包含如何工作(这是一种问题),但我找到了一个向我展示一般语法的文件。例如,我可以将“DERP.INC”与“DERP.ASM”文件结合使用。这个 ASM 文件将定义一个变量(db 值)“horse”,我可以通过执行以下操作将其导出到 INC 文件中:

externdef horse:BYTE

并将其放入 ASM 文件中:

PUBLIC horse

在 INC 文件中,我们明确指出 horse 的大小是一个字节。现在,精灵定义如下:

sprite db 1, 0, 0
       db 0, 1, 0
       db 0, 0, 1 

我如何能够导出整个字节数组?

4

1 回答 1

1

没有必要。sprite只是一个将映射到某个地址的名称。由您来处理从该地址开始的多少字节可能构成同一条数据的一部分。一种常见的方法是:

sprite db 1, 0, 0
       db 0, 1, 0
       db 0, 0, 1 

sprite_len = $ - sprite

公开名称以便可以从其他文件访问它并没有真正改变这种情况。您仍然只是公开名称。如果您想跟踪长度,您也可以公开您为长度提供的名称。不过,这并不会真正导出更多或更少的数据——如果接收者已经知道精灵总是 9 字节长,那么它们可以仅根据其起始地址处理恶意代码,就像相同的代码一样文件会。您没有定义任何东西来指定精灵的长度这一事实往往表明您的代码取决于它的固定长度——如果是这样,只需导出sprite就可以了。

底线:基本上让它就像代码和数据声明在同一个文件中一样publicexterndef“导出”符号不会自动为接收代码提供有关该符号的更多或更少的信息,而不是它在同一个文件中,因此数据声明是直接可见的。

于 2012-12-08T21:03:40.940 回答