这是 Microsoft C/C++ 运行时库使用的一个特殊符号,用于表示正在使用 C 运行时库。值 9876h(十进制为 39030)是一个魔法数字,告诉链接器需要 CRT(C 运行时)初始化。
例子
cpp
.MODEL TINY
.8086
.code
ORG 100h ; COM 程序入口偏移
PUBLIC _nmi_handler ; 导出符号供C使用
extrn _main:proc
start:
; 手动设置堆栈(Tiny 模式要求)
mov ax, cs
mov ss, ax
mov sp, 05fffh
;add ax,0100h
mov ds,ax
; 调用 C 主函数
call near ptr _main
; 退出到 DOS(使用 AL 中的返回码)
mov ah, 4Ch ; DOS 功能:程序退出
int 21h
_nmi_handler PROC NEAR
push ax ; 保存寄存器
inc _nmi_count ; nmi_count++ (C变量)
pop ax ; 恢复寄存器
iret ; 中断返回
_nmi_handler ENDP
.data
EXTERN _nmi_count:WORD ; 声明外部C变量
public __acrtused
__acrtused = 9876h
.stack
END start ; 指定入口点为 start
常见使用场景:
1. 在 MASM/TASM 汇编文件中:
cpp
.386
.model flat, stdcall
public __acrtused
__acrtused = 9876h
; 您的代码在这里
- 为什么需要它:
当链接时没有显式包含 C 运行时库时,这个符号确保正确的 CRT 初始化
对于控制台应用程序或使用某些 CRT 函数时特别重要
防止链接器优化掉必要的启动代码
- 典型上下文:
这通常用于混合汇编/C 语言项目,或编写需要 CRT 支持但不包含完整 C 运行时库的纯汇编程序。
替代方案(更现代的方法):
对于较新的工具链,您可能希望使用:
cpp
// 在 C 文件中:
#ifdef __cplusplus
extern "C" {
#endif
int _fltused = 0x9876;
#ifdef __cplusplus
}
#endif
注意:
确切的值和行为可能因不同版本的 Visual Studio/Windows SDK 而有所不同。如果您遇到与 CRT 初始化相关的链接器问题,这个声明可能有助于解决它们。