外部定义
定义一个或多个名为 name 的外部变量、标签或符号,其类型为 type。
语法
EXTERNDEF * 名称:类型 *
如果在模块中定义了 name,则将其视为PUBLIC。如果在模块中引用了name,则将其视为EXTERN。如果未引用name,则将忽略它。type 可以是ABS,它将name作为常量导入。通常用于包含文件中。
问题
当MASM全局常量
NUMBER EQU 12345
需要在程序集文件之间共享,是否应将其作为
EXTERNDEF NUMBER:ABS
还是应该将常量本身移到包含文件中?
这两种方法都能正确构建,但哪种方法是首选方法?
示例
在此包含文件中声明全局常量
包含的数字
EXTERNDEF NUMBER:ABS
常量在此程序集文件中定义
装配数量
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
也在此程序集文件中引用
绝对装配
option casemap:none
include num.inc
.code
main proc
mov rax,NUMBER
ret
main endp
end
使用此批处理文件汇编
**绝对 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
1条答案
按热度按时间rqcrx0a61#
在这本书 The Art of 64-Bit Assembly,Volume 1 x86-64 Machine Organization and Programming(Randall Hyde) 中找到了答案,它对ABS的使用作了如下说明:
MASM实际上有两个外部符号声明指令:外部和外部定义。
这两个指令使用以下语法
其中symbol是要从另一个装配单元使用的标识符,type是该符号的数据类型。数据类型可以是以下任何一种:
*abs,表示常数值
abs类型不用于声明泛型外部常量(如someConst = 0)。纯常量声明(如下面这样)通常出现在头文件中(一个包含文件),本节将简要介绍它。相反,abs类型通常是为基于对象模块中代码偏移量的常量保留的。例如,如果在程序集单元中有以下代码,
someLen的类型在extern声明中为abs。