• 汇编的诞生
  • 汇编全景图
    • 核心主干: CPU架构
    • 主要分支: 语法和工具
    • 共同的地貌: 核心概念
  • 延伸: 跨平台 & 跨架构
    • 跨平台
    • 跨架构
    • 总结
      • 以 GAS vs. NASM 为例
      • NASM 不支持跨架构 ≠ 无法在ARM架构上的系统安装

汇编的诞生

  • 机器语言的困境
    • 早期的程序员直接使用机器语言进行编程
    • 机器语言由纯粹的数字(0, 1) 组成, 对应着CPU可以直接执行的指令和数据
    • 繁琐, 反人类, 难以记忆
  • 汇编语言的诞生
    • 为了解决上述问题, 人们发明了汇编语言(Assembly Language)
    • 核心思想: 为那些晦涩的二进制机器指令起一个简单易记的英文缩写, 助记符(Mnemonic)
    • 例如:
      • ADD 代表 加法 操作
      • MOV 代表 移动 数据
    • 10110000 01100001 -> MOV AL, 97 大大提高编程效率和可读性
  • 汇编器的作用
    • CPU只能理解二进制机器码, 看不懂 MOV AL, 97 这样的指令
    • 汇编器被创造: 将汇编语言写的源代码汇编(翻译)成机器语言目标代码

汇编全景图

[图片]

核心主干: CPU架构

汇编语言不是一种标准化的语言, 不同的CPU架构有不同的指令集, 因此有完全不同的汇编语言.

  • x86/x86-64 (CISC 复杂指令集)
    • 领地: Windows, Linux.
    • 特点: 历史悠久, 指令集庞大且复杂, 变长指令, 寄存器数量小但功能强大
    • 厂商: Inter 和 AMD 自行设计, 制造和销售芯片
  • ARM (RISC 精简指令集)
    • 领地: 智能手机, 嵌入式设备, 物联网. 今年来凭借 Apple M系列芯片进入桌面领域
    • 特点: 设计简洁, 指令定长, 寄存器数量多, 采用 "加载-存储"架构
    • 厂商: ARM公司只设计IP核(架构蓝图), 授权给其他公司(苹果, 高通, 三星, 华为等), 由这些公司自行生产
  • 其他架构
    • MIPS: 经典的RISC设计, 曾在路由器, 嵌入式广泛应用
    • RISC-V: 开源的精简指令集架构, 非常简单化和简洁, 发展迅猛
    • AVR/PIC: 主要用于微控制器(MCU), 是 Arduino 等开发板的核心

主要分支: 语法和工具

确定了架构主干后, 你会遇到具体的 “方言” 和工具

除了不同风格的语法, 不同的汇编器也有会自己的宏和处理指令

  1. x86 分支下两条路
    • Inter 语法
      • 特点: 指令 目标操作数, 源操作数, 例: mov eax, 5
      • 代表汇编器
        • NASM: 跨平台, 开源, 语法清晰一致
        • MASN: 微软官方工具, 主要用于Windows环境
    • AN&T 语法
      • 特点: 指令 源操作数, 目标操作数, 例: mov $5, %eax
      • 代表编译器
        • GAS (GNU Assembler): Linux 和 GCC 编译器的默认后端
  2. ARM 分支下的路
    • 语法: 语法风格相对统一, 主要是 GNU 汇编风格
    • 编译器:
      • GAS: Linux 下编译 ARM 代码的标准工具

共同的地貌: 核心概念

无论你走在哪条主干和分支上, 有些地貌特征是共通的, 这就是汇编语言的 核心概念, 也是学习的重点

  • 寄存器(Registers): CPU 内部高速存储单元
  • 内存寻址模式(Memory Addressing Modes): 如何计算出操作数在内存中的地址. 如 直接寻址, 寄存器间接寻址, 基址变址寻址等.
  • 指令集(Instruction Set)
    • 数据传送: MOV, PUSH, POP, LEA
    • 算数运算: ADD, SUB, INC, DEC, MUL, DIV
    • 逻辑运算: AND, OR, XOR, NOT
    • 控制流: JMP, CALL, RET, 以及各种条件跳转
  • 程序结构(Program Structure): 如何划分代码段, 数据段; 如何使用标签(Labels)
  • 系统调用与中断(Syscalls & Interrupts): 如何让操作系统内核为你服务(例: 输出文字, 读取文件)

延伸: 跨平台 & 跨架构

  • 架构(Architecture): 底层硬件蓝图, 指的是CPU的设计, 它定义了:
    • 指令集: CPU 能够理解和执行的基本命令集合(例: ADD, MOV 等), 不同架构之间最根本的区别
    • 寄存器
    • 内存访问方式
  • 平台(Platform): 完整的运行环境, 指的是硬件架构和操作系统的组合, 它提供了软件运行的完整生态系统
    • Windows on x86-64: 最常见的PC平台
    • Linux on x86-64: 笔记本电脑, 服务器
    • Linux on ARM: 智能手机, 平板, 嵌入式等
    • MaxOS on x86-64: 2019年之前的苹果Mac电脑
    • MaxOS on ARM: 搭载M系列芯片的苹果Mac电脑

跨平台

同一份源代码编译出来的程序, 或者同一个解释型程序, 能够在不同的操作系统上运行, 不需要修改代码

关心的是: 操作系统的差异, 例: 文件路径(c:\ vs /), 动态库格式(.dll vs .so), GUI框架等

如何实现:

  • 用户需要先安装一个 运行时环境 或 虚拟机 (如 JVM, Python解释器), 这个运行时环境本身是需要为特定平台专门编译的
  • 你的源代码被编译成一种中间格式(如java的.class字节码). 这个中间格式是跨平台, 跨架构的. 当用户在具体平台运行它时, 本地的运行环境会负责将中间格式 “翻译” 成当前平台能理解的本地指令

跨架构

同一份源代码编译出来的程序, 能够在不同的CPU架构上运行

关心的是: CPU指令集的差异, 软件必须被编译成目标架构能理解的机器码

如何实现:

  • 方案一: 分发代码

    • 提供程序的源代码, 用户在自己的机器上针对自己的架构自行编译
    • 例: Linux 开源软件
  • 方案二: 提供多个二进制版本

    • 开发者提前为不同的架构分别编译好, 用户根据自己的CPU下载对应的版本
    • 例: Python 官网同时提供 x86-64 和 ARM64 的安装包

总结

以 GAS vs. NASM 为例

特性GAS (GNU Assembler)NASM (Netwide Assembler)
跨架构是。一个工具,多种架构否。只专注于x86/x86-64架构
跨平台是。可在Win, Linux, macOS等系统上运行是。可在Win, Linux, macOS等系统上运行
默认语法AT&T 语法Intel 语法
“家族”属于庞大的GNU工具链(GCC, ld, objdump等)是一个独立的、专注的汇编器

NASM 不支持跨架构 ≠ 无法在ARM架构上的系统安装

让我们分两层理解:

  1. NASM 本身是一个程序, 可以被编译为特定操作系统和架构上运行的版本. 这也是跨平台的特性
  2. NASM 的功能, 无论NASM在哪个操作系统上运行, 它的核心功能只有一个: 将 Inter 语法格式的 x86/x86-64 汇编源代码 汇编成 x86/x86-64 架构的机器码
    因此, 会产生以下情况:
    1. 在 x86 Linux 上: 可以运行 NASM, 它正常工作, 生成 x86 的 .o 目标文件
    2. 在 ARM Linux 上: 你也可以安装和运行一个专门为 ARM 架构编译的 NASM 程序, 但是, 这个 NASM 程序仍然智能处理 x86汇编代码, 并试图输出 x86 机器码.
      • 这在大多数情况下是没有意义的, 生成的x86机器码在 ARM CPU上无法直接执行
      • 这种操作通常只用于 交叉编译的特殊场景, 比如你在一个 ARM 服务器上为 x86 电脑编译程序

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96062.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96062.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/96062.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

广州旅游网站系统 - 纯静态旅游展示平台

🌟 广州旅游网站系统 - 纯静态旅游展示平台观世界才有世界观 - 一个集景区展示、旅游攻略、文化传播于一体的精美旅游网站📋 项目概述 这是一个专注于广州旅游文化的纯静态网站系统,采用现代化的前端技术栈,为游客提供全方位的广州…

Qt UDP通信学习

Qt UDP通信学习 一、项目概述 本项目基于Qt框架实现了UDP通信功能,支持单播与广播消息收发,展示了UDP套接字的基本用法,适合初学者学习Qt网络模块的实际应用。 二、项目结构 55.pro:Qt工程文件,配置模块与源码文件main…

古德哈特定律(Goodhart‘s Law)

古德哈特定律(Goodhart’s Law)表述为“当一个指标变成了目标,它将不再是个好指标”。 该定律由英国经济学家查尔斯古德哈特(Charles Goodhart)在1975年提出,最初用于批判撒切尔夫人政府的货币主义政策&…

在 ASP.NET Core 8 Web API 中实现基于角色的授权 安全且可扩展 API 的最佳实践

掌握基于角色的授权:使用专家策略保护您的 ASP.NET Core 8 Web API。在 ASP.NET Core 8 Web API 中实现基于角色的授权:安全且可扩展 API 的最佳实践介绍授权是任何 Web 应用程序的关键组件。在开发 API 时,使用基于角色的授权保护端点可确保…

AutoHotkey识别图片

一、下载ImagePut插件 下载地址:GitHub - iseahound/ImagePut: A core library for images in AutoHotkey. Supports AutoHotkey v1 and v2. 二、将插件和要搜索的图片导入项目 #Include ./plugin/ImagePut.ahk ; 截取当前屏幕 pic : ImagePutBuffer(0) point : p…

CamX-Camera常用编译命令和adb指南

g_camxsettings vendor/qcom/proprietary/camx/src/settings/g_camxsettings.xml 控制相机debug的信息都在该文件里面 0、相关代码 framwork层 frameworks/av/camera/ frameworks/av/services/camera frameworks/av/services/camera frameworks/hardware/interfaces/camerase…

LabVIEW 实现颜色平滑渐变控制

LabVIEW 中实现 LED 颜色从蓝到红的平滑渐变显示在 LabVIEW 开发中,若需让 LED(或类 LED 显示控件)实现从蓝色到红色的平滑色彩渐变(模拟温度等参数从低到高的视觉反馈),可通过自定义颜色查找表 数值缩放映…

阴阳学:从入门到精通

第一篇:入门篇——阴阳基础理论1.1 阴阳的起源与哲学意义阴阳概念的历史渊源《易经》中的阴阳思想阴阳与宇宙、自然、人生的关系阴阳对思想、行为、社会的影响1.2 阴阳的基本属性与符号阴阳的特征、象征与对立统一阴阳在自然界的表现(昼夜、冷热、动静等…

Java工业通信实战(三):Modbus RTU串口通信实现

想象一下,你要和一台工业设备"对话",比如询问温度传感器"现在多少度?“或者告诉电机"转快一点”。 Modbus RTU就是这种"对话"的标准语言,就像人与人之间说普通话一样。 它采用主从结构,…

CentOS安装或升级protoc

卸载旧版本 sudo yum remove protobuf protobuf-c protobuf-compiler -y sudo rm -f /usr/bin/protoc sudo rm -rf /usr/include/google/protobuf 下载 wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.0/protoc-3.15.0-linux-x86_64.zip unz…

人工智能在医学图像中的应用:从机器学习到深度学习

目的:人工智能(AI)模型在生物医学研究和医疗服务中扮演着越来越重要的角色。本综述聚焦于在现实世界背景下,开发AI应用作为临床决策支持系统时需要澄清的挑战性问题。方法:进行了一项叙述性综述,包含对1989…

基于Echarts+HTML5可视化数据大屏展示-智慧小区大数据分析

效果展示&#xff1a;代码结构&#xff1a;主要代码实现 index.html布局 <!doctype html> <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8"><title>智慧农业大数据展示</title><link rel"s…

【LeetCode热题100道笔记】验证二叉搜索树

题目描述 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 严格小于 当前节点的数。 节点的右子树只包含 严格大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 示例 1&…

Apache Tomcat 教程:从入门到精通(含目录结构与版本详解)

​​​​​​1. 背景​​ Apache Tomcat 是一个开源的 ​​Java Servlet 容器​​&#xff0c;由 ​​Apache 软件基金会&#xff08;ASF&#xff09;​​ 开发和维护&#xff0c;最初由 ​​Sun Microsystems​​ 的软件架构师 ​​James Duncan Davidson​​ 设计&#xff0…

设计模式从入门到精通之(六)策略模式

策略模式&#xff1a;让算法灵活切换的秘密武器在日常开发中&#xff0c;算法的选择常常是程序设计的核心&#xff0c;比如支付方式的选择、排序逻辑的切换、促销活动的动态调整等。当需求变化时&#xff0c;我们需要在多个算法之间切换&#xff0c;但又不希望修改已有代码。如…

安装MATLAB205软件记录

安装MATLAB2025 一台电脑可以安装多个版本的MATLAB; 下载资源 微信公众平台-MATLAB R2025a v25.1下载及安装教程 安装步骤 解压, 压缩文件大小为13.8GB 装载 选中setup.exe右键单击以管理员身份运行 我有文件安装密钥 接受许可条款 复制粘贴密钥 63733-59078-50866-02827-…

MySQL 基础架构(一):SQL语句的执行之旅

MySQL系列文章 MySQL 基础架构&#xff08;一&#xff09;&#xff1a;SQL语句的执行之旅 你是否好奇过&#xff0c;一条看似简单的SQL查询语句&#xff0c;在MySQL内部究竟经历了怎样的"奇幻之旅"&#xff1f;从连接建立到结果返回&#xff0c;MySQL是如何层层处理、…

Spring Boot 使用 Druid 连接池极致优化

在 Spring Boot 中使用 Druid 连接池进行极致优化&#xff0c;需要从核心参数调优、监控体系搭建、安全增强、连接管理及性能适配等多个维度综合考虑。以下是分阶段的详细优化策略&#xff1a;一、基础环境准备确保使用最新稳定版 Druid&#xff08;截至 2024 年推荐 1.2.38&am…

【Big Data】Apache Kafka 分布式流处理平台的实时处理实践与洞察

目录 一、Apache Kafka是什么 二、Kafka的诞生背景 三、Kafka的架构设计 四、Kafka解决的技术问题 五、Kafka的关键特性 六、Kafka与其他消息队列系统的对比 七、Kafka的工作原理 八、Kafka的部署与使用方法 1. 集群部署 2. 生产者与消费者配置 3. 安全配置 4. 监控…

23种设计模式——装饰器模式(Decorator Pattern)详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…