【问题标题】:Assembly: Organizing long segments of varied data组装:组织各种数据的长段
【发布时间】:2021-03-18 01:18:23
【问题描述】:

我正在用汇编程序编写游戏,我想知道是否有一种方法可以在一行中混合可变长度,就像您可以在一行中定义许多相同长度的变量一样。这是一个例子:

.Sprites:
    db $0f,120,39,$D506E3

此示例在该列表中的最后一个数字上失败,因为它不是一个字节。但是这个:

.Sprites:
    dl $0f,120,39,$D506E3

编译并在变量之间插入空格。 我希望能够改变大小的原因是因为这将是一个包含许多精灵的表格,并且每个精灵都有相同的格式,所以最好将每个人的数据留在一行而不是使用两行可以困惑:

.Sprites:
    ?? $0f,120,39,$D506E3
    ?? $0b,110,39,$D5001C
    ?? $01,120,36,$D509A1

【问题讨论】:

  • (1) 你用的是什么汇编程序? (2)你想让$D506E3像三个字节d5 06 e3,还是24位little-endiane3 06 d5,或者32位little-endian00d506e3 = e3 06 d5 00,还是什么?
  • 我认为大多数程序都会让这些数据由其他脚本自动生成,然后可以为db 写出单个字节。像 nasm 这样的一些汇编程序也有 incbin,您可以在其中导入外部二进制文件,而无需麻烦地将其转换为 db 指令。
  • @NateEldredge 1.fasmg 用于 ti-84 pce。 2.我实际上是在使用记忆标签。它是一个指向精灵像素数据的指针。我希望它采用标签通常采用的任何格式
  • 每条记录最好使用 2 行,因此第一行可以是 db,第二行可以是 dl。或者,如果您的汇编器支持某种 struct 语法?

标签: assembly fasm


【解决方案1】:

我通过在fasmg 中创建一个宏解决了这个问题。

macro sprite? color*,x*,y*,spriteID*
    db color
    dw x
    db y
    dd spriteID
end macro

【讨论】:

  • 例如,您可以通过将结构重新排序为x, y, color 顺序来避免未对齐的dw。虽然因为整个事情总共是 8 个字节,但如果第一个是 8 个(甚至 4 个)字节对齐的,那么dw 将不会跨越 4 字节边界,因此在具有至少 32 位总线的 x86 CPU 上可能不会在 4 字节 dword 内的奇数地址处访问 2 字节对象不会受到任何惩罚。 (IDK 关于带缓存的早期 x86 CPU,但现代 x86 不会对 32 字节块内甚至 64 字节缓存行内未对齐的加载/存储造成惩罚。)不过,数据未对齐还是有点不寻常
猜你喜欢
  • 1970-01-01
  • 2018-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2019-10-06
  • 2013-12-14
  • 2014-04-04
相关资源
最近更新 更多