assembly 何时在MASM中使用带ABS的EXTERNDEF?

0h4hbjxa  于 2022-12-13  发布在  其他
关注(0)|答案(1)|浏览(222)

外部定义

定义一个或多个名为 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
rqcrx0a6

rqcrx0a61#

在这本书 The Art of 64-Bit Assembly,Volume 1 x86-64 Machine Organization and Programming(Randall Hyde) 中找到了答案,它对ABS的使用作了如下说明:
MASM实际上有两个外部符号声明指令:外部和外部定义。
这两个指令使用以下语法

extern symbol:type {optional_list_of_symbol:type_pairs}<br>
externdef symbol:type {optional_list_of_symbol:type_pairs}

其中symbol是要从另一个装配单元使用的标识符,type是该符号的数据类型。数据类型可以是以下任何一种:

  • proc,它指示符号是过程(函数)名还是语句标签
  • 任何MASM内置数据类型(如byte、word、dword、qword、oword等)
  • 任何用户定义的数据类型(如结构名称)
    *abs,表示常数值
    abs类型不用于声明泛型外部常量(如someConst = 0)。纯常量声明(如下面这样)通常出现在头文件中(一个包含文件),本节将简要介绍它。相反,abs类型通常是为基于对象模块中代码偏移量的常量保留的。例如,如果在程序集单元中有以下代码,
public someLen
someStr byte   "abcdefg"
someLen =      $-someStr

someLen的类型在extern声明中为abs

相关问题