macOS上的彙編入門(五) 第乙個匯程式設計序

2021-09-25 06:41:24 字數 1763 閱讀 8517

通過前幾篇文章,我們逐步建立了學習組合語言之前需要的基礎知識。接下來,在這篇文章中,我們開始編寫我們的第乙個匯程式設計序了。

工欲善其事,必先利其器。我們編寫組合語言,至少需要編輯器、彙編器和鏈結器。編輯器,就是提供語法高亮、智慧型縮排、自動補全等功能的文字編輯軟體,彙編器與鏈結器則是組合語言需要的核心裝備,其功能我會在接下來的幾篇文章中提到。我使用的編輯器是visual studio code, 彙編器是自帶的as, 鏈結器也是自帶的ld.

我們在編輯器中輸入如下語句,並在自己的目錄下儲存為exit.s.

# exit.s    

.section __text,__text

.globl _main

_main:

movq $0, %rax

retq

然後在終端下進入該目錄,鍵入如下命令:

as exit.s -o exit.o
然後再鍵入

ld exit.o -o exit -lsystem
此時該目錄下應該會有乙個叫exit的可執行檔案,我們在終端下執行它:

./exit
然後,什麼都沒有發生,程式自動退出了。大功告成!

關於這個程式的解釋,我決定下篇文章再講。這篇文章接下來的篇幅,我打算談一談彙編器與彙編語法。

組合語言是機器碼的human-readable版本。雖說如此,彙編語法現在的主流也有兩大陣營:intel語法與gas語法。其最顯著的區別就在於,intel語法的組成是「指令+目的+源」,而gas語法的組成是「指令+源+目的」。就比如說,同樣的意思,intel語法是「給小明乙個粉筆」,而gas語法則是「把乙個粉筆給小明」。這兩種語法並沒有優劣,在這一系列文章中,我主要介紹的是gas語法。

intel語法是在windows上進行組合語言程式設計時主要使用的,而gas語法,又稱為at&t語法,則主要是在linux和類unix上進行組合語言時會用到。這裡並不是說在不同作業系統上必須用不同的語法,在類unix的macos上也能用intel語法,只不過是大家都偏好這麼用罷了。

我們知道,對於一門程式語言來說,它有對應的編譯器和偵錯程式。對於編譯器來說,在類unix系統上主要有兩大陣營:gcc和llvm. gcc包括c編譯器gcc、偵錯程式gdb等,llvm專案包括c編譯器clang、偵錯程式lldb等。對於編譯器,gcc的思路是對於每乙個cpu架構、每一種作業系統,都開發乙個對應的編譯器,將**直接編譯成對應的可執行檔案;而llvm專案的思路則是將編譯過程分為前端和後端,無論是在什麼平台、什麼cpu架構下,編譯器前端都是相同的,將源**編譯成llvm中間碼(ir). 而後端則是將ir再翻譯成對應作業系統中對應cpu架構下的可執行檔案。因此,如果有a種語言,b個作業系統和c個cpu架構,那麼gcc一共需要abc種編譯器,而llvm專案則一共需要a種前端和bc種後端,最終效果是只需要a+bc種編譯器**。

對於高階程式語言,gcc與llvm的競爭主要在於編譯的優化、效率等,但是對於組合語言,由於其可以直譯機器碼,所以並不存在彙編器優化,因此,在機器碼層面,gcc和llvm是等效的。在這一系列文章中我使用的彙編器as是"mac os x mach-o gnu-based assemblers", 偵錯程式是llvm的lldb.

我在我的github上,知乎專欄上和csdn上同步更新。

macOS上的彙編入門(一) 引言

我最近乙個階段都在學習組合語言,但是,當我想使用我的mac編寫組合語言的時候,發現了許多問題。比如說,大多數實體的教材都採用的是32位甚至是16位的處理器,在如今僅支援64位架構的macos 10.15上根本不能原生執行 再者,基於xnu這種類unix核心的macos系統,組合語言的部分細節,如系統...

第乙個入門例子

1 配置thinkphp 2 嘗試控制器和檢視 1 資料庫 在開始之前,我們首先在資料庫thinkphp中建立乙個think data資料表 以mysql資料庫為例 create table if not exists think data id int 8 unsigned not null au...

組合語言第乙個程式

接下來,我們開始真正學寫匯程式設計序,前面都是鋪墊知識,我和大家一起學習,如果 講的不好或講錯了,謝謝大家幫我指出。assume cs codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h i...