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

相关推荐
j_xxx404_43 分钟前
Linux:静态链接与动态链接深度解析
linux·运维·服务器·c++·人工智能
bubiyoushang8881 小时前
STM32F103C8T6+DM9051以太网功能实现方案
stm32·单片机·嵌入式硬件
c++之路2 小时前
C++23概述
java·c++·c++23
IT_阿水2 小时前
基于STM32河流水质检测
stm32·单片机·嵌入式硬件
黑白园2 小时前
STM32定时器中断
stm32·单片机·嵌入式硬件
leo__5203 小时前
IEC 104 协议 C 语言实现
c语言·数据库
学涯乐码堂主3 小时前
有趣的“打擂台算法”
c++·算法·青少年编程·gesp
weixin_456808383 小时前
【沁恒蓝牙开发】ADC DMA定时采样、转化
单片机·嵌入式硬件
云栖梦泽4 小时前
Linux内核与驱动:14.SPI子系统
linux·运维·服务器·c++
华普微HOPERF4 小时前
MCU+BLE射频+丰富外设,BLE SoC如何高效传输数据?
单片机·嵌入式硬件