在x86程序集中导出字节数组

时间:2012-12-08 20:48:14

标签: assembly import x86 masm

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

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

externdef horse:BYTE

并将其放入ASM文件中:

PUBLIC horse

在INC文件中,我们清楚地说明马的大小是一个字节。现在,精灵定义如下:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

sprite_len = $ - sprite

将名称公开以便可以从其他文件访问它并不会真正改变这种情况。你仍然只是公开这个名字。如果你想跟踪长度,你也可以将你给出的名称公之于众。这并没有真正导出更多或更少的数据 - 如果接收器已经知道精灵总是9个字节长,他们可以只使用它的起始地址,就像同样的代码一样。文件会。您没有定义任何指定精灵长度的事实往往表明您的代码依赖于它是固定长度 - 如果是这样,只需导出sprite就可以了。

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