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

相关推荐
小辉同志21 分钟前
207. 课程表
c++·算法·力扣·图论
kang_jin33 分钟前
C语言结构体入门:stu定义与成员使用
c语言·教程·编程语言·入门·结构体
feng_you_ying_li42 分钟前
C++11,{}的初始化情况与左右值及其引用
开发语言·数据结构·c++
小樱花的樱花1 小时前
打造高效记事本:UI设计到功能实现
开发语言·c++·qt·ui
独小乐1 小时前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
不吃鱼的羊1 小时前
ADC扫描组Scan Group
单片机
零二年的冬2 小时前
epoll详解
java·linux·开发语言·c++·链表
坚持编程的菜鸟2 小时前
The Blocks Problem
数据结构·c++·算法
tankeven2 小时前
HJ171 排座椅
c++·算法
6Hzlia2 小时前
【Hot 100 刷题计划】 LeetCode 39. 组合总和 | C++ 回溯算法与 startIndex 剪枝
c++·算法·leetcode