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

相关推荐
雾岛听风眠2 小时前
【OpenCV+STM32】二维云台颜色识别及追踪
stm32·单片机·嵌入式硬件
程序员zgh2 小时前
CMake 项目构建工具介绍
c语言·开发语言·c++·编辑器
量子炒饭大师2 小时前
一天一个计算机知识——【编程百度】向上取整
c语言·数据结构·c++·git·github
Dream it possible!2 小时前
LeetCode 面试经典 150_字典树_添加与搜索单词 - 数据结构设计(96_211_C++_中等)
c++·leetcode·面试·字典树
nassi_2 小时前
ESP8266 Wi-Fi模块解析
stm32·嵌入式硬件
dragoooon342 小时前
[C++——lesson26.「多态」]
java·c++·学习方法·多态
向阳逐梦2 小时前
马达驱动芯片核心逻辑:从信号到动力的“功率放大密码”
单片机·嵌入式硬件
1+2单片机电子设计3 小时前
基于 STM32 的羽毛球运动状态监测系统设计
stm32·单片机·嵌入式硬件
国科安芯3 小时前
CANFD 总线多节点扩展技术:节点数量限制与突破方案
单片机·嵌入式硬件·安全性测试