這本教科書簡要介紹了彙編語言程式設計。這個介紹之所以「溫和」是因為它假設讀者已經熟悉 C 或 C++ 編碼。我們使用這些假定的知識向後過渡到低階 ISA(指令集架構)。
我們要強調一個非常尖銳的觀點:
彙編語言沒什麼好怕的!如前所述,如果您已經熟悉 C(或 C 的衍生語言,例如 C++),那麼本書將從您已經了解的內容開始。
後面的章節將更深入地探討 ARM V8 ISA 的角落和凹槽,適合那些希望掌握 64 位元 ARM 處理器豐富指令集的人。
是的,絕對是。
彙編語言程式設計非常依賴底層硬體架構。主機操作環境在確定彙編語言程式的建構方式方面發揮著巨大的作用。 「呼叫約定」是指如何呼叫函數以及如何傳遞參數。
最初,本書只教授 ARM LINUX 約定。然而,隨著時間的推移,我們開發了一套宏,使編寫在 MacOS 或 LINUX 上使用的程式碼變得更加容易。
此連結將指向它們的最新副本以及文件。還包括使程式設計變得更容易的巨集。
本章提供了一些有關 Apple Silicon 組譯語言程式設計的附加資訊。
您會注意到我們直接使用 C 運行時而不是進行作業系統系統呼叫。因此,例如,如果我們想呼叫write()
,我們就從組譯語言中呼叫write
。
此版本的系統呼叫write
是內建在 C 運行時 (CRT) 中的包裝函數,它處理執行系統呼叫的較低層級細節。請參閱此處,以了解這些包裝函數內部實際發生的情況。
使用 CRT 包裝器的好處是使用 CRT 包裝器所掩蓋的發行版和體系結構之間存在差異。因此,當您使用包裝器而不是直接進行系統呼叫的方法時,您的程式碼將更加可移植。
儘管 ARM 的設計值得稱讚,但 ARM 的智慧財產權命名約定卻很糟糕。在本書中,AARCH64 和 ARM V8 被視為 64 位元 ARM 指令集架構 (ISA) 的同義詞。
在 ARM 網站上找到文件非常困難,因為它們有如此多的版本,同一件事有如此多的名稱,而且一般文件也如此之多。這真的會讓人抓狂。
在文本中,我們將酌情提供密切相關的連結。
這是指向「a」主指令集頁面的連結。
取得彙編語言開發工具非常簡單 - 也許您已經擁有它們。從 Linux 終端機使用apt
,如下所示:
sudo apt update
sudo apt install build-essential gdb
在 Macintosh 上鍵入:
xcode-select --install
進入航站樓並按照指示操作。請注意, gdb
已被lldb
取代,其差異足以讓您哭泣。
那麼您將需要您最喜歡的編輯器。我們自己使用vi
進行快速編輯,使用 Visual Studio Code 進行任何繁重的工作。
我們使用gcc
,C“編譯器”。也可以使用g++
。在 Mac 上,也可以使用clang
。
這有什麼意義......使用“編譯器”來“編譯”彙編語言?
好吧,要回答這個問題,我們必須明白「編譯器」一詞僅指建置序列中的一個步驟。我們所說的「編譯器」其實是一個保護傘,包括:
作用於任何#
預處理器指令(例如#include
的預處理器。這些命令不是 C 或 C++ 的一部分。相反,它們是預處理器的命令。
請注意,如果您的彙編語言檔案以.S
(大寫 S)結尾,則gcc
將呼叫C 預處理器。它,具體取決於您的系統。
實際的編譯器,其工作是將高階語言(例如 C 和 C++)轉換為組合語言。
彙編器,將彙編語言轉換為尚未準備好執行的機器碼。
最後是連結器,它組合了潛在的許多中間機器程式碼檔案(稱為目標檔案)、潛在的許多程式庫檔案(Windows 上靜態連結的 .dll 和 Linux 上靜態連結的 .a 檔案)。連結器是該鏈中的最後一步。
這是解釋此過程的影片。
我們直接使用 gcc 和 g++,因為它們是保護傘,可以自動執行上述步驟並自動與 CRT 連結。
假設您已在 C 檔案 (main.c) 中實作了main()
,並且想要使用您編寫的組合語言檔案 (asm.S)。它可以通過多種方式完成。
gcc main.c asm.S
這就是最小構建所需的全部內容。產生的程式將寫入a.out
。產生的所有中間文件都將被刪除。
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
以這種方式使用, .o
檔案會保留在磁碟上。使用前面的方法, .o
檔案將被刪除,而您看不到它們。
假設main()
是用組譯語言實作的,並且main.s
是獨立的,那麼簡單:
gcc main.S
通常,您需要啟用偵錯器gdb
或lldb
。這樣做:
gcc -g main.S
如果沒有-g
命令列選項,您的偵錯器可能無法正常運作。
重複一遍,如果您希望gcc
透過 C 預處理器運行您的程式碼(例如處理#include
),請使用大寫 S 命名您的彙編語言原始程式碼檔案。
gcc main.s
不會經過 C 預處理器,但是
gcc main.S
將要。
為了說明「編譯器」是一個保護傘,使用 gcc 來「編譯」程式會導致在 ARM 上執行的 Ubuntu 上呼叫以下命令:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
是 C 預處理器 - 它是一個通用工具,也可以被其他語言使用(例如 C++)。
cc1
是實際的編譯器。
彙編器as
。
ld
是連結器。
你可以明白為什麼我們在本書中預設使用傘命令。
我們首先提供所謂的從 C 和 C++ 到組合語言的「橋接」。我們利用您已有的知識來學習新知識 - 這真是太酷了!
章 | 降價 | |
---|---|---|
0 | 啟動 | 關聯 |
1 | 你好世界 | 關聯 |
2 | 如果語句 | 關聯 |
3 | 循環 | |
3a | While 循環 | 關聯 |
3b | For 迴圈 | 關聯 |
3c | 實施繼續 | 關聯 |
3d | 實施中斷 | 關聯 |
4 | 間奏曲 | |
4a | 暫存器 | 關聯 |
4b | 載入和儲存 | 關聯 |
4c | 更多關於ldr | 關聯 |
4天 | 暫存器大小 | 關聯 |
4e | 十六進位 | 關聯 |
5 | switch | 關聯 |
6 | 功能 | |
6a | 呼叫和返回 | 關聯 |
6b | 傳遞參數 | 關聯 |
6c | 呼叫一些常見C運行時函數的範例 | 關聯 |
7 | FizzBuzz - 一個完整的程序 | 關聯 |
8 | 結構體 | |
8a | 結盟 | 關聯 |
8b | 定義 | 關聯 |
8c | 使用 | 關聯 |
8天 | 什麼是“這個” | 關聯 |
9 | const | 關聯 |
浮點運算使用自己的指令和自己的暫存器組。因此,浮點運算在其各自的部分中進行了介紹:
章 | 降價 | |
---|---|---|
0 | 章節概述 | 關聯 |
1 | 什麼是浮點數? | 關聯 |
2 | 暫存器 | 關聯 |
3 | 截斷和捨入 | 關聯 |
4 | 文字 | 關聯 |
5 | fmov | 關聯 |
6 | 半精度浮點數 | 關聯 |
7 | NEON SIMD 尚未編寫 | 關聯 |
一本關於組合語言的書如果沒有一點點的抨擊會怎麼樣呢?
章 | 降價 | |
---|---|---|
1 | 位元字段 | |
1a | 沒有位域 | 關聯 |
1b | 帶位域 | 關聯 |
1c | 審查新描述的指示 | 關聯 |
2 | 位元組序 | 關聯 |
在本節中,我們將介紹各種資料,包括我們關於調試的「世界著名講座」。本次講座受到多所大學的邀請。它面向使用 C、C++ 和彙編語言等語言的讀者,但其中包含的一些課程適用於所有語言。
章 | 降價 | |
---|---|---|
1 | 蘋果矽 | 關聯 |
2 | Apple / Linux 融合 | 關聯 |
3 | 可變參數函數 | 關聯 |
4 | 底層:系統調用 | 關聯 |
5 | 確定 C 函數的字串文字長度 | 關聯 |
6 | 從 Python 呼叫彙編語言 | 關聯 |
7 | 原子操作 | 關聯 |
8 | 跳轉表 | 關聯 |
9 | 精液 | ASM程式碼 |
10 | 自旋鎖 | 關聯 |
- | 調試講座 | PPTX |
如上面所示,可以在此處找到巨集套件。
這裡有一些專案規範,可以為您不斷提高的掌握能力提供挑戰。以下是按字母順序排列的非常簡短的描述。
也許在解決這些問題之前,請先查看完整描述的 FIZZBUZZ 程式。
然後嘗試將此作為您的第一個項目。加上一些空行和註釋,它總共有 35 行。
DIRENT 專案示範如何在組合語言中使用複雜的struct
。
PI 專案示範了浮點指令。該程式將“向目標投擲飛鏢”,透過追蹤“擊中目標”的飛鏢數量與“投擲”的飛鏢總數來計算 PI 的近似值。
SINE 專案強調浮點數學和函數。
SNOW 計畫使用 1970 年代的技術來製作簡單的粒子系統動畫。該專案展示了將複雜問題分解為更簡單部分的合理設計流程。
WALKIES 呈現了一個可愛的小動畫,演示了一些指針取消引用的循環。
Perry Kivolowitz 在電腦科學領域的職業生涯只有不到 50 年。他創辦了超過 5 家公司,主要涉及硬體、影像處理和視覺效果(用於電影和電視)。 Perry 因在《巴比倫 5》試播集《The Gathering》中的出色表現而獲得艾美獎。 SilhouetteFX 幾乎用於所有重要的電影中,用於動態觀察、繪畫、追蹤、2D 到 3D 重建、合成等。
1996 年,佩里因其形狀驅動變形和變形技術的發明而獲得奧斯卡科學技術成就獎。 《阿甘正傳》、《泰坦尼克號》和《星際之門》中許多著名的效果就是採用這種技術。
二、二十三歲是佩里在大學教授電腦科學的第 19 年,在威斯康辛大學麥迪遜分校教授十年,現在在迦太基學院教授 8 年多。
Perry 對組合語言充滿熱情,曾在以下 ISA 工作過(按時間順序排列):
尤尼真空1100
數位設備公司 PDP-11
數位設備公司 VAX-11
摩托羅拉 68000
以 AARCH64 開頭的 ARM
謹將此作品獻給我的妻子薩拉以及兒子伊恩和埃文。
Perry 建立了一個包含約 200 個程式設計專案的函式庫,適用於 CS 1、CS 2、資料結構、網路、作業系統和電腦組織課程。如果電腦科學教科書(或其他電腦科學相關內容)的出版商有興趣購買該圖書館,請與我們聯絡。
另外,也可以看看 Get Off My L@wn,一本寫給程式設計師的殭屍小說。
您沒看錯…精英程式設計師 Doug Handsman 退休後回到妻子 Ruth Ann 的故鄉威斯康辛州北部。然後,世界末日發生了。真糟糕。
評分為 4.3 分(滿分 5 分),有超過 70 則評論,讀起來很有趣,幾乎不需要花錢。