汇编语言跨模块使用变量和标号

默认情况下,变量和符号对其包含模块是私有的(private)。可以使用 PUBLIC 伪指令输出指定过程名,如下所示:

PUBLIC count, SYM1
SYM1 = 10
.data
count DWORD 0

访问外部变量和符号

使用 EXTERN 伪指令可以访问在外部过程中定义的变量和符号:

EXTERN name:type

对符号(由 EQU 和 = 定义)而言,type 应为 ABS。对变量而言,type 是数据定义属性,如 BYTE、WORD、DWORD 和 SDWORD,可以包含 PTR。例子如下:

EXTERN one:WORD, two:SDWORD, three:PTR BYTE, four:ABS

使用带 EXTERNDEF 的 INCLUDE 文件

MASM 中一个很有用的伪指令 EXTERNDEF 可以代替 PUBLIC 和 EXTERN。它可以放在文本文件中,并用 INCLUDE 伪指令复制到每个程序模块。比如,现在用如下声明定义文件 vars.inc:

;var s.inc
EXTERNDEF count:DWORD, SYM1:ABS

接着,新建名为 sub1.asm 的源文件,其中包含了 count 和 SYM1,以及一条用于把 vars.inc 复制到编译流中的 INCLUDE 语句。
;sub1.asm
.386
.model flat,STDCALL
INCLUDE vars.inc
SYM1 = 10
.data
count DWORD 0
END
因为不是程序启动模块,因此 END 伪指令省略了程序入口标号,并且不用声明运行时堆栈。

现在再新建一个启动模块 main.asm,其中包含 vars.inc,并使用了 count 和 SYM1:
; main.asm
.386
.model flat,stdcall
.stack 4096
ExitProcess proto, dwExitCode:dword
INCLUDE vars.inc
.code
main PROC
    mov count,2000h
    mov eax,SYM1
    INVOKE ExitProcess,0
main ENDP
END main

关注微信公众号「魏雪原」,跟着站长一起学习,拒绝躺平,跳出内卷,用知识完成阶级跃升:

  • 每日更新,坚持原创,敢说真话,凡事有态度。
  • 编程+求职+创业+营销,既有硬知识,也有软技能。
  • 手机端阅读教程,随时随地都能学习。
  • 即将绑定网站部分功能,包括注册登录、找回密码、获取下载链接等。

魏雪原二维码
微信扫描二维码关注魏雪原