EXTERNDEF
定义一个或多个名为name 的外部变量、标签或符号,其类型为type。
语法
EXTERNDEF name:type
如果 name 在模块中被定义,它被视为 PUBLIC。如果在模块中引用了名称,则将其视为 EXTERN。如果未引用名称,则忽略它。 type 可以是 ABS,它将 name 作为常量导入。通常用于包含文件。
问题
当一个 MASM 全局常量
NUMBER EQU 12345
需要在程序集文件之间共享,是否应该将其添加到包含文件中
EXTERNDEF NUMBER:ABS
还是应该将常量本身移动到包含文件中?
两种方法都能正确构建,但哪种方法更受青睐?
示例
在此包含文件中声明全局常量
num.inc
EXTERNDEF NUMBER:ABS
该常量在此汇编文件中定义
num.asm
option casemap:none
include num.inc
NUMBER EQU 12345 ; Decided to define here (not moved to 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
最佳答案
在这本书The Art of 64-Bit Assembly, Volume 1 x86-64 Machine Organization and Programming (Randall Hyde)中找到了答案,它对 ABS 的用法说明如下:
MASM实际上有两个外部符号声明指令:extern 和 externdef。
这两个指令使用语法
extern symbol:type {optional_list_of_symbol:type_pairs}<br>
externdef symbol:type {optional_list_of_symbol:type_pairs}
其中符号是您要从另一个组装单元使用的标识符, type 是该符号的数据类型。数据类型可以是任何 以下:
proc,表示该符号是一个过程(函数)名 或声明标签
任何 MASM 内置数据类型(例如 byte、word、dword、qword、oword 和 等等)
任何用户定义的数据类型(例如结构名称)
abs,表示一个常量值
abs 类型不用于声明通用的外部常量,例如 someConst = 0。纯常量声明,例如这个,通常会 出现在头文件(包含文件)中,本节将对此进行描述 不久。相反,abs 类型通常保留给常量 基于目标模块中的代码偏移量。例如,如果您有 汇编单元中的以下代码,
public someLen
someStr byte "abcdefg"
someLen = $-someStr
someLen 的类型,在外部声明中,将是 abs。
关于assembly - 何时在 MASM 中将 EXTERNDEF 与 ABS 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74738084/