__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 初始化相关的链接器问题,这个声明可能有助于解决它们。

相关推荐
www.stcai.com几秒前
《单片机原理与应用》,详细介绍。基于 STC, Ai8051U, 8位/32位 双核 全支持 AiCube 图形化配置外设,自动生成程序框架
单片机·嵌入式硬件
计算机安禾5 分钟前
【c++面向对象编程】第45篇:萃取(Traits)技术与策略类:STL源码中的智慧
开发语言·c++
运筹vivo@5 分钟前
3043. 最长公共前缀的长度(Leetcode 每日一题)
c++·算法·leetcode·职场和发展·每日一题
杜子不疼.9 小时前
【C++ AI 大模型接入 SDK】 - DeepSeek 模型接入(上)
开发语言·c++·chatgpt
嵌入式老牛10 小时前
HC32F460_ADC驱动(三)
单片机·嵌入式硬件
石山代码10 小时前
C++ 内存分区 堆区
java·开发语言·c++
秀秀更健康11 小时前
stm32: 系统时钟如何配置为72Mhz
stm32·单片机·嵌入式硬件
LuminousCPP12 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
张小姐的猫12 小时前
【Linux】多线程 —— 线程互斥
linux·运维·服务器·c++
QAQ小菜鸟14 小时前
一、安装Altium Designer 26.1
嵌入式硬件