如何在 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' 文件的顶部。
但有些定义更普遍。这些可能是 EQU
s、EXTERN
s、MACRO
s、STRUCT
s 等。对于这些,您可以有一个通用的 'common.inc',它包含在多个文件。
我试图将一个非常大的 .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' 文件的顶部。
但有些定义更普遍。这些可能是 EQU
s、EXTERN
s、MACRO
s、STRUCT
s 等。对于这些,您可以有一个通用的 'common.inc',它包含在多个文件。