在 MASM 8086 程序集中读取多个文件

Posted

技术标签:

【中文标题】在 MASM 8086 程序集中读取多个文件【英文标题】:Reading multiple files in MASM 8086 Assembly 【发布时间】:2021-01-08 16:24:22 【问题描述】:

我想在 MASM 中制作动画,我一直在这样做。我如何使这更有效?就像把它变成一个字符串数组?以及如何在递增时仅使用单个地址访问它?我真的需要它,因为在主 proc 中,我的代码由于过于硬编码或彼此相距太远而超出范围

frame1FileName DB 'frame1.bin', 0
frame2FileName DB 'frame2.bin', 0
frame3FileName DB 'frame3.bin', 0
frame4FileName DB 'frame4.bin', 0
frame5FileName DB 'frame5.bin', 0
frame6FileName DB 'frame6.bin', 0
frame7FileName DB 'frame7.bin', 0
frame8FileName DB 'frame8.bin', 0
frame9FileName DB 'frame9.bin', 0
frame10FileName DB 'frame10.bin', 0
frame11FileName DB 'frame11.bin', 0
frame12FileName DB 'frame12.bin', 0
frame13FileName DB 'frame13.bin', 0
frame14FileName DB 'frame14.bin', 0
frame15FileName DB 'frame15.bin', 0
frame16FileName DB 'frame16.bin', 0
frame17FileName DB 'frame17.bin', 0
frame18FileName DB 'frame18.bin', 0
frame19FileName DB 'frame19.bin', 0
frame20FileName DB 'frame20.bin', 0

【问题讨论】:

【参考方案1】:

将所有 ASCIIZ 文件名存储在具有相同长度的记录中。

这意味着前 9 个被额外的零填充。记录大小变为 12

frameFileName DB 'frame1.bin', 0, 0
              DB 'frame2.bin', 0, 0
              DB 'frame3.bin', 0, 0
              DB 'frame4.bin', 0, 0
              DB 'frame5.bin', 0, 0
              DB 'frame6.bin', 0, 0
              DB 'frame7.bin', 0, 0
              DB 'frame8.bin', 0, 0
              DB 'frame9.bin', 0, 0
              DB 'frame10.bin', 0
              DB 'frame11.bin', 0
              DB 'frame12.bin', 0
              DB 'frame13.bin', 0
              DB 'frame14.bin', 0
              DB 'frame15.bin', 0
              DB 'frame16.bin', 0
              DB 'frame17.bin', 0
              DB 'frame18.bin', 0
              DB 'frame19.bin', 0
              DB 'frame20.bin', 0

您可以通过计算其在表格中的偏移量并将其添加到表格的开头来引用正确的文件名。 address = start + index * recordsize.

如果从零开始,第一个文件名的索引为 0,第 20 个文件名的索引为 19,那么任何特定文件名的有效地址都来自:

; BX is file index [0,19]
mov  ax, 12                  ;
mul  bx                      ; In 8086 there's no "IMUL BX, 12"
mov  bx, ax                  ;
lea  bx, [frameFileName + bx]

或者,如果您不想破坏 DX 并且您不需要超过 255 个文件:

; AL is file index [0,19]
mov  ah, 12
mul  ah
mov  bx, ax
lea  bx, [frameFileName + bx]

使用您填写的带有 2 位数字的模板。

这将节省大量空间,尤其是在文件数量增加的情况下。它甚至可能需要 3 或 4 位数字。

frameFileName DB 'frame??.bin', 0

...

; AL is file index [1,20]
aam                          ; Divides AL by 10, Use this only if AL=[0,99]
add  ax, 3030h               ; Convert to text
xchg al, ah
mov  bx, offset frameFileName
mov  [bx+5], ax

【讨论】:

您还可以将文件名表定义为地址引用序列并保持其计数。我对 masm 语法不是很清楚,但是在 fasm 中,您可以定义文本并在其他地方使用该定义标签作为查找。此外,链表等数据结构非常有用,无论您是自己制作还是使用库。 这是我的代码github.com/JunnielRome/Animation/blob/main/chicken.asm 我不太擅长这个,也不知道如何调试我的代码。将我所有的 ASCIIZ 文件名存储在具有相同长度的记录中,但我的帧会跳过然后停止,即使我只是将其增加 1。我真的很感激顺便说一句 哦,等等,我现在可以看到问题了,哈哈,这是我修改计数的方式。编辑:它现在有效!谢谢楼主! MUL 很慢(在 8086 上),并且 12 = 4 x 3 只需要多一条指令。 mov bx, ax / add bx,bx / add bx, ax (bx = ax * 3) / shl bx,2 (bx = ax * 12)。 32位模式当然要好很多,lea ebx, [eax + eax*2]/shl ebx,2(或者使用[filename + EBX*4]作为寻址模式)。此外,如果有帮助,不使用 MUL 可以首先避免使用 AX,但确实需要 2 个 regs...如果您从 BX 中的值开始,shl bx,2/lea ax, [bx + filename]/add ax, bx/add bx,ax带有表地址的 LEA 的 MOV,但比 MUL 更模糊/不那么明显。

以上是关于在 MASM 8086 程序集中读取多个文件的主要内容,如果未能解决你的问题,请参考以下文章

错误 A2105:预期:指令或指令程序集

在 MASM 程序集中逐字节循环和处理字符串

masm x86 程序集崩溃中的 DOS 中断

MASM 程序集将 8 位寄存器移动到 16 位寄存器(即 mov cx,ch)[重复]

为 8086 组装游戏添加背景音乐

求一个汇编语言课程设计的MASM32时钟的程序