解構匯編, 萬物起源

  • 匯編的誕生
  • 匯編全景圖
    • 核心主干: 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…