汇编
文章平均质量分 89
xingke
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C语言内存精讲系列(三十):C 语言内存泄漏(Memory Leak)详解
简单来说,内存泄漏就是程序中动态分配的内存(堆区内存)不再被使用,却没有被释放,导致这部分内存永远无法被回收。就像我们向图书馆借了一本书,看完后没有归还,也没有告诉任何人这本书在哪里 —— 这本书就成了 “无主之物”,虽然还在图书馆里,却再也不能被其他人使用。在 C 语言中,当用malloc()没有任何指针指向它程序再也无法访问到它也没有被free()释放这时,这块内存就发生了泄漏。内存泄漏是 C 语言开发中必须重视的问题,它不像语法错误那样会被编译器发现,而是悄无声息地影响程序运行。原创 2025-09-22 07:58:55 · 979 阅读 · 0 评论 -
C语言内存精讲系列(二十七):C 语言变量的存储类别和生存期(上)
最后我们用一张图把今天的核心知识点串起来,帮大家巩固记忆:想让变量 “用完就丢,不占长期内存”,用默认的auto(栈区);想让变量 “长期存在,下次调用还能复用值”,用static(静态数据区);想让变量 “访问超快,频繁使用不耗时”,用register(寄存器,需满足条件);想让变量 “大小灵活,按需分配”,用堆区(malloccalloc申请,free释放)。下节课我们会讲extern关键字,以及动态内存分配(堆区变量),大家可以先预习一下malloc函数的基本用法~原创 2025-09-20 10:51:28 · 825 阅读 · 0 评论 -
C语言内存精讲系列(二十九):C 语言堆区内存进阶与动态内存实战
到这里,我们已经学完了堆区内存的所有核心操作(malloccallocreallocfree申请必判空malloccallocrealloc返回后,必须判断是否为NULL,否则访问NULL会崩溃;realloc 用临时指针:避免原内存地址丢失,失败时手动释放原内存;释放后置 NULLfree后必须把指针置为NULL,避免野指针(后续误操作会报错,便于排查);不重复释放:同一个堆地址只能free一次,重复释放会报错;不释放非堆内存free只能释放malloccallocrealloc。原创 2025-09-20 10:52:48 · 692 阅读 · 0 评论 -
C语言内存精讲系列(二十八):C 语言变量的存储类别和生存期(下)
定义:给变量分配内存、给函数写具体实现(只能有一次,否则编译器会报错 “重复定义”);声明:告诉编译器变量 / 函数的类型和名字(可以有多次,不分配内存,不写实现)。extern就是用来做 “声明” 的,它不会重复分配内存,只是 “搭桥” 让当前文件能使用其他文件的变量 / 函数。// global.c 文件:定义全局变量(分配内存)// 定义全局变量g_count,初始化为0(定义只能有一次)// 定义一个函数,修改这个全局变量g_count++;// 直接操作本文件的全局变量存储类别。原创 2025-09-20 10:51:56 · 894 阅读 · 0 评论 -
C语言内存精讲系列(二十六):再谈 x86 保护模式
转换阶段输入地址核心操作输出地址核心目标段式转换逻辑地址(段选择子 + 段内偏移)1. 解析段选择子,索引 GDT/LDT 获取段描述符;2. 硬件校验(存在性、权限、越界、类型);3. 计算线性地址 = 段基址 + 段内偏移线性地址逻辑隔离(代码/数据/栈分离)、权限控制(内核/用户隔离)页式转换线性地址1. 拆分地址为页目录索引、页表索引、页内偏移;2. 二级页表查询(PDE→PTE),获取物理页帧基址;3. 页级权限校验(R/W、U/S);原创 2025-09-20 09:08:18 · 992 阅读 · 0 评论 -
C语言内存精讲系列(二十四):C语言动态内存分配
流程完整:从malloc()申请,到realloc()扩容 / 缩容,再到free()释放,覆盖了动态内存的核心使用场景;安全第一:每一步都判断了函数返回值是否为NULL,避免了野指针和内存泄漏;释放合理:只释放了最后一个指针small_ptr—— 因为realloc()成功后,旧指针(init_ptrlarge_ptr)指向的内存已经被系统回收,不需要再free(),避免重复释放;可移植性高:用指定内存大小,不管什么系统都能正确申请内存。原创 2025-09-19 18:06:59 · 791 阅读 · 0 评论 -
C语言内存精讲(二十三):栈溢出攻击的防范措施
如果编译器防护还不够,操作系统也会提供底层防护机制,即使前两道防线被突破,还能最后拦截。防护层级具体措施作用编码层面用安全函数(fgets/strncpy)、检查长度从源头减少溢出可能编译器层面开启栈保护(-fstack-protector)检测到溢出就终止程序操作系统层面ASLR 随机化地址、NX 标记栈不可执行即使溢出也难以执行恶意代码打个比方:这就像家里的安全防护 ——编码规范是 "锁好门窗",最基础也最重要;编译器防护是 "防盗门",能挡住大部分恶意闯入;原创 2025-09-19 13:17:57 · 1084 阅读 · 0 评论 -
C语言内存精讲(二十二):栈溢出攻击的原理
C 语言等底层语言不会自动检查数组边界使用了 gets、strcpy 等不安全的函数,它们不限制输入长度函数返回地址等关键信息存放在栈上,与局部变量相邻理解栈溢出攻击原理,不仅能帮助我们写出更安全的代码,也能让我们明白计算机安全的重要性。在实际开发中,我们应该避免使用 gets 等危险函数,改用 fgets 等有长度限制的函数,从源头减少栈溢出风险。原创 2025-09-19 12:52:28 · 296 阅读 · 0 评论 -
C语言内存精讲系列(二十):一个函数被调用时栈上到底会发生哪些具体变化
本文深入解析了函数调用过程中栈帧的构建与销毁机制。栈帧是函数在栈上的"临时工作区",包含参数、返回地址、旧基址指针、局部变量和寄存器备份五部分。通过实例拆解函数调用时栈帧的搭建过程:参数压栈→返回地址压栈→建立新栈帧→预留局部变量空间→保护寄存器。出栈时则逆向操作:恢复寄存器→释放局部变量→恢复旧基址→返回调用点→清理参数。特别指出"局部变量销毁"仅是栈指针移动,数据实际仍存留直至被覆盖。Debug模式下未初始化变量会被填充0xCCCCCCCC标记。理解栈帧机制对排查原创 2025-09-18 10:26:28 · 1597 阅读 · 0 评论 -
C语言内存精讲系列(十九):结合代码实例理解栈、帧、堆等内存概念
本文通过C代码实例解析了栈、帧、堆等内存概念的实际表现。在栈与栈帧部分,展示了函数调用时地址从高到低的生长特性,以及各函数栈帧的独立性;通过汇编代码说明了帧指针(EBP)和栈指针(ESP)如何协同管理栈帧。堆内存部分则用malloc演示了手动分配、地址不连续的特性,并与栈内存形成对比。最后通过栈溢出实验验证了"堆栈"即栈的旧称。文章将抽象概念与具体代码一一对应,帮助读者建立直观认知,理解这些术语命名的内在逻辑。原创 2025-09-18 07:35:06 · 1194 阅读 · 0 评论 -
C语言内存精讲系列(十八):彻底理清栈、帧、堆等内存核心概念
本文用生活化比喻厘清了计算机内存管理中的核心概念:栈(Stack)如同堆叠盘子的架子,遵循先进后出规则;帧(Frame)类似电影画面,是函数的独立内存单元;栈帧即存储在栈上的函数数据块。帧指针(EBP/RBP)固定栈帧起始位置,栈指针(ESP/RSP)动态跟踪栈顶。堆(Heap)则像随意堆放的柴火堆,支持灵活的内存分配。特别指出"堆栈"是"栈"的旧称而非"堆+栈"。全文通过"盘子堆-电影帧-柴火堆"的生动类比,将抽象概念具象化,原创 2025-09-18 07:26:52 · 660 阅读 · 0 评论 -
C 语言内存精讲系列(二十一):C 程序的启动流程 ——main 函数前发生了什么?
摘要:在VS2022调试中,调用堆栈显示main函数并非程序起点,而是由启动函数链(mainCRTStartup→__scrt_common_main→invoke_main)调用。这些启动函数负责初始化CRT环境、处理命令行参数和异常处理等准备工作。不同编译器(如GCC、LLVM)的启动流程存在差异,但核心逻辑相似:运行时库通过入口函数完成初始化后调用用户main函数。通过调试实践可验证这一调用链,理解CRT在程序运行中的桥梁作用。原创 2025-09-18 12:56:37 · 615 阅读 · 0 评论 -
C语言内存精讲系列(十五):再谈用户模式与内核模式
这篇文章深入讲解了操作系统中的用户模式与内核模式概念,以及它们与程序、进程、虚拟内存的关系。文章首先区分了程序(静态文件)和进程(动态运行实例)的区别,通过代码示例演示了同一程序可以对应多个独立进程。然后详细解释了用户模式(低权限)和内核模式(高权限)的运行机制,包括模式切换的过程和必要性,通过printf的例子展示了从用户模式到内核模式的完整切换流程。文章特别澄清了内核/用户空间划分与物理内存无关的重要概念,解释了操作系统如何通过分页机制和交换空间管理有限的物理内存。最后总结了核心知识点,包括进程独立性、原创 2025-09-16 11:29:18 · 1337 阅读 · 0 评论 -
C语言内存精讲系列(十四):Windows 下 C 语言程序的内存布局(内存模型)
本文对比分析了Windows与Linux系统下C程序内存布局的异同。在32位Windows中,4GB虚拟地址空间默认分为2GB内核空间和2GB用户空间,用户空间包含固定起始地址的exe程序(0x00400000)、分散加载的DLL、堆区和独立栈区。64位Windows布局逻辑类似但空间更大(8TB用户空间)。与Linux的规整布局不同,Windows采用更灵活的分散分配策略。通过代码示例展示了关键区域的实际地址分布(exe、DLL、堆、栈),并总结了两大系统在内核/用户空间比例、区域布局等方面的核心差异。理原创 2025-09-16 11:04:56 · 799 阅读 · 0 评论 -
C语言内存精讲系列(十三):Linux 下 C 语言程序的内存布局(内存模型)
Linux下C程序的内存布局解析:32位与64位系统对比 本文详细讲解了Linux系统中C语言程序的内存布局模型。主要内容包括: 内存空间划分:32位系统分3GB用户空间和1GB内核空间;64位系统分128TB用户空间和128TB内核空间。 用户空间五大核心区域: 程序代码区(只读+执行) 常量区(只读) 全局数据区(可读写) 堆区(手动malloc/free) 栈区(自动管理) 关键特性对比: 全局变量在全局数据区,生命周期长 局部变量在栈区,函数结束即释放 字符串常量在常量区,可安全返回地址 堆区向上增原创 2025-09-16 10:50:11 · 991 阅读 · 0 评论 -
C语言内存精讲系列(十二):内存分页机制(课堂答疑)
文章摘要:本文探讨了直接访问特定虚拟地址(如0X12345678)是否会出错的问题。核心在于页表映射和访问权限:1)若地址未分配或权限不足(常见情况),MMU会触发页错误或权限错误导致程序终止;2)若地址在合法内存段内(如malloc分配区域或全局变量地址)且权限正确,访问可正常执行。通过三个实验代码验证了合法与非法地址访问的差异,说明操作系统通过分页机制保护内存安全。关键结论:虚拟地址能否访问取决于页表映射是否存在以及程序是否具备相应权限。原创 2025-09-16 10:32:57 · 821 阅读 · 0 评论 -
C语言内存精讲系列(十一):内存分页机制 —分页、页表、MMU、TLB、页表内存权限
内存分页机制是操作系统实现虚拟地址映射的关键技术,通过将程序分割成固定大小的"页"(通常4KB)来优化内存管理。该机制解决了传统大粒度映射的效率问题,实现了按需加载:只将当前需要的虚拟页加载到物理内存,暂时不用的页保留在磁盘。分页涉及三种页类型:虚拟页(VP)、物理页(PP)和磁盘页(DP)。通过页表记录映射关系,其设计从简单的一级页表演进到节省内存的两级/多级页表。MMU硬件单元配合TLB缓存加速地址转换,CR3寄存器实现程序快速切换。页表还包含权限控制位,防止程序非法访问内存区域。这原创 2025-09-16 10:26:08 · 1118 阅读 · 0 评论 -
C语言内存精讲系列(九):深化详述 int 3(附录:int3 调试关键工具与实战案例)
本文详细介绍了int3调试工具的使用与实战案例。Windows平台推荐WinDbg和x64dbg,支持断点设置、寄存器查看等功能;Linux平台常用GDB和LLDB。通过一个程序崩溃案例,演示了如何利用int3定位空指针问题。同时提供了常见问题排查方案,如断点插入失败、指令恢复错误等。最后强调int3作为调试基础技术的重要性,需结合不同平台工具特性,并注意现代系统的安全限制,以提高调试效率。原创 2025-09-09 13:00:13 · 483 阅读 · 0 评论 -
C语言内存精讲系列(十):虚拟内存、C 语言的 “假地址” 与内存对齐
虚拟内存是中间层:C 语言打印的地址是虚拟地址,需通过 CPU 映射到物理地址,解决了 “地址冲突” 问题;虚拟地址的优势:隔离不同程序的地址空间(安全),提高内存使用效率(高效);内存对齐:CPU 按步长读内存,编译器通过对齐让数据不跨块,提高寻址效率,代价是少量空间浪费。这些底层机制虽然不直接写代码,但理解它们能帮你解决很多 “奇怪” 的问题(比如结构体大小、指针越界),也是后续学习操作系统、嵌入式开发的基础。课后大家可以自己改改代码,比如把全局变量改成局部变量,看看地址会不会变;原创 2025-09-16 10:06:44 · 688 阅读 · 1 评论 -
C语言内存精讲系列(八):深化详述 int 3
int 0: 除法错误中断int 1: 单步调试中断int 2: 不可屏蔽中断(NMI)int 3: 断点中断int 4: 溢出中断int 14: 页错误中断...架构师将 “3” 这个中断号专门分配给了 “断点” 功能。操作系统在启动初始化时,会将第 3 号中断的处理程序指向负责处理断点异常的代码。部分含义解释int中断指明了它的工作机制:利用 CPU 的软中断机制,强制暂停当前程序,跳转到预设的处理程序。33 号。原创 2025-09-08 23:25:27 · 968 阅读 · 0 评论 -
C语言内存精讲系列(七):深入解析 x86 实模式
本文深入解析x86架构的实模式寻址与中断机制。实模式采用"段基址×16+偏移"的寻址方式,突破16位寄存器限制实现1MB内存访问,但缺乏地址保护。中断机制通过中断向量表实现硬件/软件交互,但存在安全风险。文章通过C代码实例展示了实模式下的指令寻址、数据访问、栈操作,以及硬件中断处理和BIOS调用等关键操作,揭示了实模式"功能优先、无保护"的设计特点及其局限性,为理解后续保护模式演进奠定基础。原创 2025-09-04 20:18:26 · 1386 阅读 · 0 评论 -
C语言内存精讲系列(六):全面解析计算机“中断”
中断是现代计算机系统的核心机制,通过"打断当前流程-处理事件-恢复执行"的闭环,实现了外设高效响应、多任务调度和系统安全保护。中断分为硬件中断(外设触发)、软件中断(系统调用)和异常中断(CPU自动检测)三类,由CPU完成模式切换和上下文保存,内核执行具体处理。其核心价值在于避免CPU轮询浪费算力、支撑多任务并发、保障内核资源隔离安全。中断机制通过中断向量表、中断控制器等基础设施实现高效运行,是连接硬件、内核与用户程序的关键桥梁,堪称现代操作系统的"神经中枢"。原创 2025-09-03 12:15:27 · 1576 阅读 · 0 评论 -
C语言内存精讲系列(五):用户模式与内核模式
用户模式与内核模式的划分,是现代操作系统 “安全与效率” 平衡的核心设计:通过严格的权限隔离(内存、指令、资源、中断),防止用户程序破坏系统核心;通过可控的硬件触发切换(系统调用、中断、异常),确保用户能安全访问内核服务;同时,通过优化模式切换开销(如内存池),降低性能损耗。理解这两种模式的差异与切换机制,是掌握操作系统内存管理、进程调度、IO 处理的关键基础。原创 2025-09-03 11:10:04 · 1120 阅读 · 0 评论 -
C语言内存精讲系列(四):CPU 保护模式
CPU 的 “模式” 本质是处理器的工作规则集合:它决定了 CPU 能访问多大的内存空间、程序如何操作内存地址、是否对操作进行安全校验等核心行为。早期处理器(如 Intel 8086)仅支持一种简单模式(实模式),而现代 32 位 / 64 位 CPU 默认运行在保护模式。这两种模式的核心差异,直接定义了操作系统的能力边界 —— 从单任务的简单系统到多任务的复杂系统,模式的演进是底层硬件支撑的关键。实模式:程序直接操作物理内存,没有隔离、没有权限、没有校验,就像 “裸奔”;保护模式。原创 2025-09-02 11:56:03 · 904 阅读 · 0 评论 -
C语言内存精讲系列(三):程序在计算机中的完整运行逻辑
程序运行的完整流程拆解为四大阶段:1.加载阶段(外存→内存)操作系统加载器解析程序文件格式,分配内存空间,将代码段/数据段载入内存,并完成重定位与初始化。2.调度阶段(内存→CPU)操作系统通过进程调度和虚拟内存管理,将程序指令交给CPU执行,利用MMU实现地址转换。3.执行阶段(CPU核心运算)CPU通过"取指-译码-执行-写回"循环处理指令,依赖寄存器、缓存和运算单元协同工作。4.回收阶段操作系统在程序结束后回收内存、CPU等资源,并通过I/O设备输出结果。整个过程体现了硬件协同(外原创 2025-08-31 09:08:30 · 1445 阅读 · 0 评论 -
C语言内存精讲系列(二):为什么说学习 C 语言,绕不开 “内存”
C语言将内存控制权完全交给程序员,理解内存是掌握其精髓的关键。从变量存储到指针操作,C语言的每个核心语法都依赖内存逻辑。内存知识不仅能避免野指针、内存泄漏等问题,还能优化代码效率,是写出高效稳定程序的基础。即使高级语言自动管理内存,理解底层内存机制仍有助于排查问题和提升性能。学习C语言必须建立"内存思维",才能真正掌握这门贴近硬件的编程语言。原创 2025-08-30 10:10:44 · 759 阅读 · 0 评论 -
C语言内存精讲系列(一):程序运行的底层逻辑
硬件角色核心动作硬盘(长期存储)1. 存放程序 / 文件的原始数据;2. 作为虚拟内存,暂存内存中闲置的数据。内存(临时高速区)1. 接收加载器复制的程序数据;2. 向 CPU 提供运算所需数据;3. 暂存 CPU 的运算结果。CPU(运算核心)1. 从内存读取数据并执行运算;2. 将运算结果写回内存;3. 不直接与硬盘交互。加载器(工具程序)1. 接收操作系统指令;2. 将硬盘中的程序数据复制到内存。主板(连接枢纽)原创 2025-08-30 09:52:21 · 692 阅读 · 0 评论 -
用户模式与内核模式:操作系统的“权限双轨制”
进程是运行中的程序,拥有独立地址空间。操作系统通过用户模式和内核模式实现权限隔离:用户模式运行应用程序代码,仅能访问用户空间;内核模式执行系统调用,可访问内核空间。这种分层设计通过硬件支持的权限级别(Ring0/Ring3)保障系统安全稳定。尽管内核与用户程序共享地址空间会牺牲部分内存,但能显著提升系统调用效率,避免进程切换带来的性能损耗,是操作系统在安全与效率之间的最优平衡。原创 2025-08-28 23:28:40 · 845 阅读 · 0 评论 -
汇编指令sar与shr
首先说下理论:汇编语言中SAR和SHR指令都是右移指令,SAR是算数右移指令(shift arithmetic right),而SHR是逻辑右移指令(shift logical right)。两者的区别在于SAR右移时保留操作数的符号,即用符号位来补足,而SHR右移时总是用0来补足。例如10000000算数右移(SAR)一位是11000000,而逻辑右移(SHR)一位是01000000...原创 2018-12-22 22:05:58 · 29448 阅读 · 0 评论 -
二进制、十进制、十六进制数值对照表
十进制 十六进制 二进制 Symbol 十进制 十六进制 二进制 Symbol 0 00 0000 0000 NUL 64 40 0100 0000 @ 1 01 0000 0001 SOH 65 41 0100 0001 A 2 02 0...原创 2019-10-30 08:08:28 · 190821 阅读 · 0 评论
分享