MASM中EXTERNDEF搭配ABS的用法及共享常量方案选择
EXTERNDEF 说明
定义一个或多个名为name、类型为type的外部变量、标签或符号。
语法
EXTERNDEF name:type
- 若
name在当前模块中定义,则被视为PUBLIC; - 若在当前模块中被引用,则被视为
EXTERN; - 若未被引用,则直接忽略。
type可指定为ABS,用于将name作为常量导入,这种用法通常在头文件中使用。
问题
当MASM全局常量
NUMBER EQU 12345
需要在多个汇编文件间共享时,应该选择在头文件中添加
EXTERNDEF NUMBER:ABS
,还是直接把常量本身移到头文件中?两种方式都能正常编译,但哪种是推荐的做法?
示例
方式一:用EXTERNDEF声明常量
头文件 num.inc
EXTERNDEF NUMBER:ABS
定义常量的汇编文件 num.asm
option casemap:none include num.inc NUMBER EQU 12345 ; 在此处定义常量(不放在num.inc中) .code DoStuff proc mov rax,NUMBER ret DoStuff endp end
引用常量的汇编文件 abs.asm
option casemap:none include num.inc .code main proc mov rax,NUMBER ret main endp end
汇编用批处理文件 abs.bat
@echo on if not defined DevEnvDir ( call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat" ) ml64.exe abs.asm num.asm /link /subsystem:console /defaultlib:kernel32.lib /defaultlib:libcmt.lib
推荐做法及理由
推荐使用EXTERNDEF NUMBER:ABS的方式,原因如下:
- 单一数据源,易维护:常量的定义只存在于一个汇编文件中,头文件仅做声明。后续要修改常量值时,只需要改动定义它的那个文件,不用逐个修改所有包含头文件的模块,避免了重复维护的麻烦。
- 符合模块化规范:这种模式和C/C++等高级语言“头文件声明、源文件定义”的逻辑一致,代码结构更清晰——其他模块只需要知道常量的存在,不需要关心它的具体值是在哪里定义的。
- 避免冗余展开:如果把
EQU常量直接放在头文件中,每次包含头文件都会重新展开这个常量;而EXTERNDEF是告诉汇编器“这个常量是外部定义的”,只会做一次声明处理,更高效。
当然,如果是极其简单、几乎不会变更的小常量,直接放在头文件中也能正常工作,但从长期的可维护性和代码规范角度,EXTERNDEF的方式更优。
内容的提问来源于stack exchange,提问作者vengy
相关产品推荐
相关产品推荐

