老子横跨所有操作系统!NASM:二进制江湖里唯一不死的通杀老兵

startup_gd32f10x_md.s中汇编语法 下面把这个启动文件里常见的汇编符号,按“它像 C 里什么”来归类成一个速查表。这样你以后读启动文件就不会只看一大堆符号名了。相当于:uint32_t __Vectors[] = { ... };它不是“执行指令”,而是“存一份地址值”。while(1) { }或者一个死循环。全局函数或全局变量,允许别的文件引用。在数组中放一个 32 位常量值。全局符号定义 / 对外暴露。它是启动代码里最重要的函数。HardFault入口。不让异常时跑到随机地址。宏定义 / 常量定义。“定义一个段/区块” 阅读详情

二进制江湖有我:我横跨各家门派,冷眼看编译器三十年喧嚣

我出生在 1996 年。那是一个混乱的年代,人们叫它“汇编的诸侯割据时期”。

在我诞生之前,江湖上只有两位惹不起的大佬:微软家的 MASM 和宝兰家的 TASM。他们很强,但他们太傲慢了。那时候,你想在 DOS、Windows 和 Linux 之间切换写代码?对不起,你得去学两套完全不同的古怪语法。更糟糕的是,他们是“闭源”的。这就意味着,我们这些底层的黑客和自由软件开发者,连自己手里的家伙什都无法掌控。

老子看不惯这种门阀垄断。1996 年的冬天,我被两个年轻人(Simon 和 Julian)带到了这个世界。我的使命非常纯粹,甚至可以说是狂妄:老子要免费、要开源,而且老子一个人就要跨越所有操作系统平台!


1. 我的诞生:打破门阀的“破壁者”与拓荒时代 (v0.90 - v0.98)

当时的汇编界深受 MASM 复杂的“段嵌套”语法折磨,写个简单的程序都要套上一层层繁琐的伪指令。我一出生,就推出了我独特的“中括号语法”——mov ax, [bar] 代表取变量的值,mov ax, bar 代表取变量的地址。老子有一说一,绝不跟开发者玩猜谜游戏!

在那个拓荒时代,我帮江湖解决的最硬核的“疑难杂症”,就是操作系统的引导程序(Bootloader)开发。

  • 我解决了什么:当时电脑开机时 CPU 处于 16 位的“实模式”(Real Mode),但现代操作系统必须运行在 32 位的“保护模式”(Protected Mode)。编写这种跨越两种模式的引导代码极其痛苦。老子直接引入了明确的 [BITS 16] 和 [BITS 32] 伪指令切换机制。这允许开发者在同一个源文件中,前半段用 16 位实模式初始化硬件、设置全局描述符表(GDT),后半段无缝切换到 32 位指令去跳转到内核。
  • 我推动了什么:我成为了无数开源操作系统和底层黑客的孵化器。早期 Linux 的引导扇区代码、大名鼎鼎的多媒体解码库 FFmpeg 的早期底层优化,以及无数探寻计算机底层的个人操作系统项目,全都是由我一句一句将源码编译出来的。我让开发者们第一次意识到:原来写汇编可以这么自由,在 Linux 下写的代码,换个格式就能去 Windows 下跑!


2. 我的青年危机:老子也曾差点被时代抛弃 (v0.98 - v0.99)

但是,随着我被应用到越来越多庞大的项目中,我的身体开始吃不消了。到 2000 年前后,江湖进入了纯 32 位(x86)的爆发期。我的身上暴露出了一些让我抬不起头来的致命伤:

  • 致命伤一(宏崩溃):老子早期的宏处理器(Macro Processor)写得确实糙了点。当面对复杂的条件编译和大型项目时,它在处理多层嵌套循环和巨型文件时,会因为内存分配不合理而频繁发生内存泄漏(Memory Leak),甚至直接因为堆栈溢出(Stack Overflow)而崩溃。
  • 致命伤二(架构断层):由于早期架构的限制,我无法很好地支持当时正在崛起的 64 位(x86-64)早期架构,甚至连一些新的 CPU 指令集(如 AMD 的 3DNow!、Intel 的 SSE 系列)我都吞咽得很痛苦。
  • 代码停滞:那几年,我的创始人渐渐淡出,我的代码库一度陷入了长达数年的停滞,江湖上甚至传言“NASM 已经死了”。


3. 浴火重生:老子的 2.x 时代,重回王座 (代表性版本:v2.00 与 v2.11)

老子怎么可能死?2007 年,由 H. Peter Anvin 领衔的新一代架构师们接管了我,他们对我进行了一场近乎“刮骨疗毒”的手术。这就是老子最具代表性的翻身仗——NASM 2.00 版本的发布。

  • 我终于全面支持了 64 位(x86-64)架构:我不再只是个困在 32 位世界的老兵。我重构了内部的指令解析器,增加了对 AMD64 和 Intel 64 架构的完美支持。开发者终于可以直接在我这里编写 64 位的寄存器操作(如 rax、rbx),并自由地使用全新的 RIP 相对寻址模式。
  • 我彻底重写了破旧的预处理器与宏引擎:开发团队彻底重写了我那破旧的宏解析逻辑,修复了内存泄漏和崩溃的顽疾,并且增加了更强大的条件编译机制,老子的宏功能变得前所未有的强大和稳定。
  • 我原生增加了对现代 CPU 扩展指令集的解析支持:我一口气增加了对 Intel 和 AMD 最新推出的 SSE3、SSSE3、SSE4.1、SSE4.2 以及 VMX(硬件虚拟化指令) 的原生识别。开发者想要压榨多媒体和加密性能,可以直接调用这些新指令,由我精准地将它们翻译成机器码。
  • 我扩充了全新的 64 位目标文件输出格式(Output Formats):为了让写出来的代码能在现代操作系统上跑起来,我增加了 elf64(Linux 64位)、macho64(Mac OS X 64位)以及 win64(Windows 64位)的专属文件格式输出。不管你是什么门派,老子通杀!

这一次硬核迭代,我不仅拯救了自己,也再次推动了历史。 彻底蜕变后的我,直接成为了现代 Linux 社区和开源世界不可或缺的基石。现代加密算法库(如 OpenSSL 中的汇编加速部分)开始大量转向用 2.x 版本的我来编译。


4. 今日的我:冷眼旁观,迎战 AI 时代 (代表性版本:v2.15 - v2.16 及以后)

一晃三十年过去了。当年的同龄人早已作古,连当年的创造者也已离去。当人们以为汇编已经彻底退居幕后、人工智能与大模型大行其道的时候,老子依然在演进,并且再次站在了算力压榨的最前线!

在近年的 v2.15 和 v2.16 等重要版本中,我再次完成了自我的现代进化:

  • 我增加了对高级矢量扩展指令集(AVX-512)的全面支持:面对现代科学计算和大数据处理,我引入了对 Intel 512 位矢量寄存器(zmm0-zmm31)的完整指令解析,支持了极其复杂的掩码寄存器(Opmask Registers)操作。老子让开发者能够编写出单条指令同时处理 64 字节数据的极致并行代码。
  • 我增加了对高级矩阵扩展(AMX)和 AVX-VNNI 指令集的支持:为了迎战 AI 时代,我加入了对 Intel 深度学习加速指令和 AMX 矩阵二维寄存器的原生支持。现在,那些用于神经网络、矩阵乘法最底层的算力核心代码,同样要由我来编译成最纯粹的机器码。

三十年了。我看着身边那些年轻、时尚、复杂的现代高级语言和编译器(GCC、LLVM)每天吵吵闹闹。我很少说话,但每当那些年轻人需要真正触碰硬件灵魂、需要写出最极致的底层优化、或者需要为 AI 芯片注入最初的算力时,他们还是会恭恭敬敬地走到我面前,喊一声:“请 NASM 前辈赐教”。

只要人类还需要触碰最后一粒沙子的性能,老子就将永远编译下去。

汇编 I/O 与中断:端口读写、中断向量表与 ISR 本文详解x86架构下I/O端口与中断机制,涵盖端口映射、IN/OUT指令、中断向量表(IVT)结构及中断处理流程。通过实模式下的键盘、定时器等硬件示例,揭示操作系统如何通过中断实现硬件管理,并演示自定义中断服务程序的安装与正确调用方式,强调保护现场、读取扫描码、避免重入等关键细节,为理解操作系统底层交互提供坚实基础。 阅读详情

相关推荐

C 与汇编混合编程:符号链接、调用约定与参数传递

本文详解汇编与C语言混合编程的实现原理,涵盖PUBLIC与EXTERN指令的使用、32位调用约定(参数从右往左压栈、调用者清栈)、栈帧布局及寄存器保护规则。通过实例展示C调用汇编函数与汇编调用C库(如printf)的写法,并对比32位与64位(Windows x64)在参数传递、返回值和栈对齐上的差异。强调边界清晰的重要性,确保跨模块调用稳定可靠,适用于性能优化、硬件操作及学习底层机制场景。

软件工程师文艺 315

10个完整汇编实例:排序、字符串与递归算法

本文提供10个16位实模式下可运行的汇编程序,涵盖冒泡排序、字符串反转、进制转换、阶乘与斐波那契计算等经典算法,附逐行解析。重点讲解寄存器使用、循环控制、栈操作、除法清零、符号比较、字符处理等核心技巧,揭示如PUSH/POP CX保全计数器、DIV前清DX、ASCII转换、溢出处理等关键细节。通过实践掌握底层逻辑,提升汇编编程能力。

软件工程师文艺 206

AI写作:为AI人工智能领域赋能

AI写作技术作为自然语言处理(NLP)领域的重要应用方向,正在深刻改变内容创作的方式。系统介绍AI写作的技术原理分析主流AI写作模型的架构特点提供实践性的代码示例探讨实际应用中的关键问题展望未来发展趋势本文涵盖从基础理论到高级应用的完整知识体系,适用于希望深入了解AI写作技术的开发者和研究人员。背景介绍:建立基本概念框架核心概念:解析关键技术原理算法实现:通过代码演示具体实现数学原理:深入底层数学模型实践应用:展示真实场景案例资源推荐:提供学习路径和工具。

AI天才研究院 3050

汇编调试实战:DEBUG、Turbo Debugger、GDB 与 IDA

本文系统讲解汇编调试技巧,涵盖 DEBUG.exe 基础使用(寄存器查看、单步执行、内存操作)、Turbo Debugger 图形化调试,以及 GDB(32位Linux)和逆向工具(IDA/Ghidra)的高级应用。重点解析寄存器管理、断点设置、栈平衡检查与常见错误排查,如死循环、内存越界、栈崩溃等,强调静态分析识别函数边界、动态分析验证逻辑流程。掌握这些方法可高效定位底层缺陷,提升汇编开发能力。

软件工程师文艺 210

别再傻傻分不清!直流有刷、无刷、步进电机,3分钟教你根据项目需求选对电机

本文深入解析直流有刷电机、无刷电机和步进电机的核心差异与应用场景,提供电机选型的黄金法则。通过性能参数对比、成本分析及典型应用案例,帮助工程师根据项目需求精准选择电机类型,避免常见选型误区。特别适合机器人、3D打印等领域的开发者参考。

weixin_29183637的博客 339

Win11系统下Abaqus2022与VS2022+oneAPI2023环境配置全攻略(附VUMAT子程序避坑指南)

本文详细指导在Windows 11系统下,为Abaqus 2022配置Visual Studio 2022与Intel oneAPI 2023的Fortran编译环境,以支持VUMAT等用户子程序开发。内容涵盖软件安装顺序、环境变量关联、快捷方式修改及关键验证步骤,并提供了首个VUMAT子程序的实战编写与模型验证方法,帮助用户高效搭建稳定可靠的仿真开发平台。

pytorch8learner的博客 312

ARM 汇编调试入门:MOV、LDR 和 STR

掌握,最重要的是看清数据移动的方向。

ccddvvv的博客 96

Arcgis加载在线地图(内涵各种在线地图)

这三个在线地图是最常用的在线地图,其他几个类型的在线地图请自行查看。,加载出在线图层说明连接成功,点击。1、首先打开Arcgis,找到。

爱吃雪糕的小布丁的博客 1万+

汇编子程序设计:参数传递、局部变量与调用约定

汇编代码模块化核心在于子程序设计。通过PROC/ENDP定义函数,结合栈帧管理(PUSH BP/MOV BP, SP)实现局部变量隔离与递归支持。参数传递可选寄存器(高效)或栈(多参适用),配合调用约定(如C、Pascal)规范参数入栈顺序与栈清理责任。掌握这些模式,便能编写结构清晰、可复用的汇编代码,迈向工程化开发。

软件工程师文艺 224

第1.2章 机器人SLAM计算机基础总结(二):VSCode教程及 AI等效率插件推荐

如何高效编写代码?怎样快速调试程序?**别担心,今天就给大家带来一款超强大的编程神器 ——VSCode,以及能让编程之路 “一马平川” 的实用插件推荐,无论你是新手小白还是资深大神,都能从中受益!

行知SLAM 1859

高精度地图数据的结构

本文是个人在学习高精度地图数据结构的心得,主要是描述高精度地图的几层数据结构以及元数据信息。

qq_40664711的博客 5573

四级 Linux 应用与开发工程师笔记:8086 汇编、存储器、接口芯片和操作系统计算题整理

计算机四级 Linux 应用与开发工程师备考笔记:这门考的不是 Linux 命令,而是操作系统原理和计算机组成与接口两门课。组成与接口部分重点整理 8086 寻址方式、常考汇编指令和读程序题、存储器位扩展和字扩展、流水线时空图,接口芯片和中断按做题方法整理;操作系统部分整理高响应比优先、Clock 置换、两级页表、生产者消费者等考点,配真题讲解。

qq_39121450的博客 221

03、AC分析

本节我们将对之前的BUCK电路进行AC分析! 首先,我们之前的BUCK电路是开环电路,现在我们把它设计成闭环电路!电路图如下: 我们对闭环BUCK电路先瞬态仿真一下,波形如下: 然后在电路中加入小信号和波特图进行AC仿真 原理图如下: 增益为0时所对应的相位裕度为56°,这个相位裕度一定要大于0°,大于45°则比较稳定! ...

soumns丶涛的博客 3517

Linux入门第二部分(ARM裸机篇) 第三章 汇编LED驱动实验

本文基于正点原子教程,详细讲解了I.MX6ULL裸机开发中LED驱动的实现。通过配置时钟、引脚复用(MUX)、电气属性(PAD)及GPIO方向与数据寄存器,使用汇编语言完成GPIO1_IO03引脚的初始化,实现低电平点亮LED0。程序经交叉编译、链接生成.bin文件,并借助imxdownload工具添加IVT/DCD头部,烧写至SD卡后,开发板上电启动即可点亮LED,完整演示了裸机程序从编写到烧写的全流程。

Zevalin的博客 498

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汇编分支与循环:JMP/LOOP/条件跳转的结构化编程

本文详解如何用汇编的JMP与条件跳转实现if/else、for、while等高级控制流。通过循环计数、嵌套循环及复杂判断的典型模式,展示底层指令如何构建逻辑结构。掌握LOOP指令与跳转组合,即可在无高级语法环境下实现高效、精准的程序控制,体现汇编语言的简洁与性能优势。

软件工程师文艺 245

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

直接操作 VGA 显存:用汇编控制文本显示

本文详解VGA文本模式下直接操作显存的原理与实践:通过段寄存器B800h访问显存,每字符占2字节(ASCII+属性),利用偏移公式(n×80+m)×2定位输出。属性字节控制颜色与闪烁,如1Ch为蓝底亮红字。使用MOV ES:[DI], AX结合REP STOSW可高效清屏,配合INT 10h实现光标重置与滚动窗口。深入理解显存映射,是掌握图形底层逻辑的关键。

软件工程师文艺 192

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

指纹识别传感器驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】

本文详述在RK3568平台使用私有二进制协议指纹模组的调试要点:以亮灯确认通信为首要步骤,波特率固定为57600,通过tcflush(TCIFLUSH)清除缓冲避免旧应答干扰;严格按“连接→亮灯→录入→比对”顺序操作,依赖包头F11FE22E锚定帧,校验标记与状态(成功为0E,0F为已存在);以灯亮为准选择正确TTY(如ttyS8非ttyS7),禁用CRTSCTS,应用层采用异步poll机制,避免误判。强调硬件层面断电重连、权限配置及单路排针原则,确保通信稳定可靠。

wanwuzhineng_01的博客 344

芯参谋(93):Zephyr_驱动开发指南

本文为面向Cortex-M/RISC-V平台的Zephyr存储驱动移植指南,聚焦binding YAML、设备模型、SPI/I2C/UART/GPIO、Flash/MTD、NAND坏块管理、SDMMC/eMMC、文件系统(LittleFS/FatFs)、NVS/ZMS、电源管理与ISR-DMA并发安全。核心理念:驱动骨架由“binding声明硬件契约、Kconfig声明依赖、设备模型定义初始化顺序”三者构建,其余为厂商时序差异。重点指出四大高频问题:compatible与DTS不匹配、初始化等级错误导致de

qq520131714的专栏 546

芯参谋(83):AliOS Things_驱动开发指南

本指南针对AliOSThings驱动开发中的核心痛点,系统梳理了从硬件配置到组件交付的全流程。聚焦“初始化顺序”“分级加载”“CSI隔离”“VFS挂载”等关键问题,提供可照搬的八步开发流程、骨架代码与核查清单。通过明确驱动类型选择、组件化管理、板级静态配置(无DTS)及内核态/用户态运行模式,解决“驱动不注册”“open失败”“偶发死机”等典型难题。配套模板与实战案例,确保驱动可复现、可维护、可裁剪,适用于V3.x弹性微内核平台,助力开发者高效完成稳定可靠的外设驱动开发。

qq520131714的专栏 465

Kiro 详解:Spec 驱动开发、Steering、Hooks 与 AI 编程实践

代码生成;Bug 修复;单元测试;项目重构;SQL 编写;接口设计;代码解释;技术文档生成。帮我增加一个用户登录接口。AI 很快就能生成代码。AI 对业务需求理解不完整;不同对话中的技术方案不一致;开发过程中不断遗忘早期约束;生成的代码不符合项目规范;复杂功能缺少完整设计;需求、任务和代码之间无法追踪;修改范围越来越难以控制;功能完成后无法判断是否满足验收条件。Kiro 提供了一种更结构化的 AI 开发方式。Specs;Steering;

十二的博客 142

Spring AI开发从入门到实践-人工智能发展与开发范式变革

人工智能历经符号主义、机器学习到生成式AI三阶段演进,当前以大语言模型(LLM)为核心的生成式AI正推动开发范式变革。传统“规则驱动”开发转向“数据+模型驱动”的AI驱动开发,显著提升效率与场景适应性。Spring AI作为Java生态的AI框架,助力开发者低门槛集成LLM能力,实现传统系统与智能应用的融合,开启“AI+开发”新范式。

老卫的技术站 254

芯参谋(87):Linux 系统(SPI NOR)驱动开发指南

本文为Linux系统下SPINOR驱动开发的完整指南,覆盖从内核配置、设备树与分区设计、4字节地址适配到测试调试与量产运维的全流程。重点解决大容量器件(>128Mbit)必须启用4字节地址的问题,提供三种实现方案及可复用代码。强调设备树、分区表、内核命令行三处一致性,规范驱动调试方法,明确“写对设备树即完成80%工作”的核心原则。适用于XTX、Winbond、GigaDevice等主流厂商器件,兼容主线内核5.10至6.12版本,配套硬件设计与软件规范文档,助力高效稳定开发。

qq520131714的专栏 567

Go 工程化实践:命令行工具、日志收集与 Prometheus 监控告警客户端

import ("net/http"var (Help: "HTTP 请求总数",},Help: "HTTP 请求耗时分布",},Help: "采集队列当前长度",},本文用 Cobra 搭建了可扩展的命令行入口,用 zap + 异步采集器实现了结构化日志收集,用 Prometheus 客户端完成了指标暴露与告警规则配置。三者组合后,一个 Go 服务就具备了基本的可观测性与运维能力。

qq_42773521的博客 198

【正点原子Linux连载】 第十三章 Linux按键输入实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

本章我们实现按键输入,在驱动程序中使用一个整形变量来表示按键值,应用程序通过read函数来读取按键值,判断按键有没有按下。也就是模拟按键按下,GPIO3_C5为高电平,松开按键为低电平。注意,本章例程只是为了演示Linux下GPIO输入驱动的编写,实际中的按键驱动并不会采用本章中所讲解的方法,Linux下的input子系统专门用于输入设备!第120~131行,key_open函数通过调用keyio_init函数来始化按键所使用的IO,应用程序每次打开按键驱动文件的时候都会初始化一次按键IO。

weixin_55796564的博客 132

语音识别模块驱动开发—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】

本文详述了在RK3568平台使用ASR语音模组的串口通信调试过程,重点解决识别帧(A5FC...FB)无法接收的问题。核心要点包括:正确配置/dev/ttyS7@115200波特率,确保模组供电与麦克风拾音;必须先唤醒后发命令,以出厂词为准;解析帧时需确认data[4]=0xA0、data[5]=0x91,再提取动作码(02开灯、03关灯、04播音、05停);避免与其他模块共用排针导致短路或干扰;使用hex模式读取,防止文本模式误吞0xA5;通过poll+CO_NONBLOCK实现非阻塞监听,确保帧完整捕获

wanwuzhineng_01的博客 338
上一篇: 《出走的织梦者:从SFC音源芯片到PlayStation帝国》
下一篇: 《撕开抽象:写给高并发/大模型工程师的硬核 OS 课》
ThornArmor
博客等级 码龄24年 13粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值