__acrtused 是什么

这是 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

; 您的代码在这里
  1. 为什么需要它:

当链接时没有显式包含 C 运行时库时,这个符号确保正确的 CRT 初始化

对于控制台应用程序或使用某些 CRT 函数时特别重要

防止链接器优化掉必要的启动代码

  1. 典型上下文:

这通常用于混合汇编/C 语言项目,或编写需要 CRT 支持但不包含完整 C 运行时库的纯汇编程序。

替代方案(更现代的方法):

对于较新的工具链,您可能希望使用:

cpp 复制代码
// 在 C 文件中:
#ifdef __cplusplus
extern "C" {
#endif
int _fltused = 0x9876;
#ifdef __cplusplus
}
#endif

注意:

确切的值和行为可能因不同版本的 Visual Studio/Windows SDK 而有所不同。如果您遇到与 CRT 初始化相关的链接器问题,这个声明可能有助于解决它们。

相关推荐
端平入洛1 天前
delete又未完全delete
c++
祈安_1 天前
C语言内存函数
c语言·后端
端平入洛2 天前
auto有时不auto
c++
norlan_jame3 天前
C-PHY与D-PHY差异
c语言·开发语言
哇哈哈20213 天前
信号量和信号
linux·c++
多恩Stone3 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
czy87874753 天前
除了结构体之外,C语言中还有哪些其他方式可以模拟C++的面向对象编程特性
c语言
蜡笔小马3 天前
21.Boost.Geometry disjoint、distance、envelope、equals、expand和for_each算法接口详解
c++·算法·boost
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
m0_531237173 天前
C语言-数组练习进阶
c语言·开发语言·算法