assembly - 何时在 MASM 中将 EXTERNDEF 与 ABS 一起使用?

标签 assembly x86 masm


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/

相关文章:

variables - MASM - 宏变量?

c - 如何在 C 中的单个指令周期内添加 100 个整数元素的数组?

assembly - TASM 减一寻址

x86 - sfence 文档中的 "serializing operation"是什么意思?

operating-system - MASM 中的微型操作系统

visual-studio - assembly :以不同颜色打印一条线

c - Eclipse 不做任何超链接或至少突出显示某些 *.h 文件和 *.S 的语法

assembly - 浮点加法汇编算法

assembly - A20线在保护模式下起什么作用?

c - fork 后重新创建死线程