如何在 MASM 5.10 的表达式中使用外部 EQU

How do I use an external EQU in an expression in MASM 5.10

我试图将一个非常大的 .ASM 文件拆分成几个外部库,只在 main.asm 中留下我的主程序。

这是一个游戏,所以我希望将我的键盘输入代码拆分为input.asm,将我的Adlib声卡代码拆分为music.asm等

无论如何,我的具体问题是我的许多程序都有这样的行,它们在表达式中使用了 EQU。

  mov ax, ((scrWidth*YCoord)+XCoord)

当我将包含这些行的过程移动到外部库并尝试 assemble 那个外部库时,MASM 给我以下错误。

A2032: Illegal use of external

这个错误对我来说确实有意义。由于它们是外部的,assembler 不直接知道 scrWidth、YCoord 或 XCoord 是什么,所以它不能将它们相加或相乘。我猜这就是为什么它实际上不能生成 obj 文件的原因。

为了清楚起见,这里有两个完整的示例文件。

MAIN.ASM

TheStack SEGMENT STACK  

    DB 64 DUP ('THESTACK')

TheStack ENDS





VarData SEGMENT PUBLIC

PUBLIC const1,const2

    const1 EQU 1
    const2 EQU 2

VarData ENDS  





EXTRN Proc1:PROC  
Code SEGMENT PUBLIC

    assume cs:Code,ds:VarData

MAIN PROC

START:

    mov ax, VarData ;load DS
    mov ds, ax

    call Proc1      ;call external procedure

    mov ah,4ch      ;exit to dos
    mov al,0
    int 21h


Main ENDP

Code ENDS

     END Start

UTIL.ASM

VarData SEGMENT PUBLIC

EXTRN const1:ABS,const2:ABS

VarData ENDS   



Code SEGMENT PUBLIC

PUBLIC Proc1

    assume cs:Code,ds:VarData 


Proc1 PROC

    mov ax, (const1*const2)    ;this generates the error  
    ret

Proc1 ENDP


Code ENDS

     END

我确实尝试了一种变通方法,将 MAIN.ASM 中的 EQU 更改为变量而不是常量,然后将它们作为实际字节导入 UTIL.ASM。然后我尝试从那里将它们映射回 Util.ASM 中的 EQU,但错误是相同的。

有人知道解决方法吗?我知道这是一个非常过时的 assembler,但我真的不知道这是否是在 MASM 的后续版本中修复的已知限制。

将其移至 'Answer' 以便关闭。

就像高级语言一样,masm 支持 include 文件的能力。

正如 Ped7g 所提到的,"good programming technique" 可以确定您的定义范围。例如,您的声音相关定义位于 'music.asm' 文件的顶部,而您的视频相关定义位于 'display.asm' 文件的顶部。

但有些定义更普遍。这些可能是 EQUs、EXTERNs、MACROs、STRUCTs 等。对于这些,您可以有一个通用的 'common.inc',它包含在多个文件。