32匯編語言程序說明_Linux 匯編語言學習--編譯和鏈接

93e75cb84fb4af720ce04e4e9d073262.png

上次我們提到了匯編語言的兩種格式,Intel 和 AT&T 格式,今天講的是對應兩種編譯器的一些使用。

我們知道,編譯器就是一個將一種程序語言翻譯成另外一種語言的程序。編譯的過程其實共有5個流程:詞法分析、語法分析、語義分析和中間代碼生成、優化、目標代碼生成。具體是怎么實現的,有興趣的話,可以找一本好的《編譯原理》書看一看,順便自己也嘗試寫一個編譯器。

對于匯編語言呢,不同平臺不同格式都有各自不同的編譯器,也有一些可以跨平臺的編譯器。那么上次我們提到的Intel 格式和AT&T格式匯編使用的編譯器是什么呢?

Linux 中編譯Intel 格式使用 Nasm, 編譯AT&T格式使用Gas

下面以Hello World程序做個示范,為了區分格式,我們將Intel格式的匯編代碼文件后綴名寫為.asm,而AT&T的寫為.s.

Intel:

$> nasm -f elf hello.asm

或者

$> nasm -f elf64 hello.asm

上面的兩條命令都會生成一個hello.o目標文件,下面的那條命令可以對上兼容。elf64相當于說是說明64位機器,elf是32位。看我們的代碼可以知道,如果寄存器中使用的rax之類的,那么一定是64位的。當然,這個問題都不大,不管使用那一條命令,其實都能通過。

生成.o文件之后,我們就需要用鏈接器(linker)將目標文件鏈接起來,生成可執行文件

$> ld -m elf_i386 -o hello hello.o  $> ld -o hello hello.o $> ld -o -m elf_x86_64 -o hello hello.o

上面的第1條鏈接命令對應前面的第一條編譯命令,第2,3條是等價的,對應前面第二條編譯命令。之前也說了,這是一個對應機器位數的問題。如果混用,會出現不匹配問題,看圖說話。

71082266558d63460a3ffa29a4b8acd4.png

65c2826b5d9f8efdf0c73e6ccdd5943c.png

情況就是這么個情況,不要問為什么。這就跟找對象一樣,合適是很重要了。

AT&T

使用Gas編譯AT&T格式匯編。Gas 是GNU中自帶的,如果是Linux系統的話,基本上都自帶了,不需要再安裝。

Gas編譯起來沒有那么多花樣

$> as -o hello.o hello.s


$> ld -o hello helle.o

通也是生成了可執行文件hello

測試一下

7fdeeb41c0046f81e1123d079177aeb1.png

關于編譯和鏈接的一些參數,可以通過使用 --help 參數來查看,一般來說掌握幾個基本參數即可。

到目前來說呢,基本的概念和幾個工具都已經簡單講完了,后面將會開始正式的開始我們的匯編語言學習。為了好看吧,將會以Intel格式來講解,期待一波吧。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/530177.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/530177.shtml
英文地址,請注明出處:http://en.pswp.cn/news/530177.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

占用系統資源測試_高頻性能測試面試題15道

1、解釋常用的性能指標名稱與具體含義性能測試 通過測試工具模擬多種正常、峰值及異常負載條件來對系統的各項性能指標進行測試。驗證軟件系統是否能夠達到用戶提出的性能指標,發現系統中存在的性能瓶頸并加以優化。性能指標分為兩個方面:系統指標&#…

ensp1.3.00.100用哪個virtualbox_virtualBox使用 Ubuntu18.0.4

一、視圖進入縮放模式,虛擬機上方菜單欄無法顯示?熱鍵c,恢復。 熱鍵默認為右邊的ctrl鍵。開啟增強功能?打開虛擬機后,點擊上方設備-->安裝增強功能。虛擬機里面會出現識別到光盤。先掛載光盤到指定路徑:…

動態ram依靠什么存儲信息_處理器內存系統1(ROM,RAM,數據存儲順序)

本篇文章主要介紹處理器中存儲器:ROM和RAM以及數據在內存中的存儲順序:大/小端(Little/Big Endian)。只讀存儲器(ROM)ROM(Read Only Memory)用來存儲和保存數據。ROM數據不能隨意更新,但是在任何時候都可以讀取。即使是斷電,ROM也…

python中row的用法_關于Python中openpyxl使用iter_rows()的方法

之前已經對iter函數的用法有過講解,記憶遺忘的小伙伴可以重新回顧一遍。今天就iter函數的拓展,講講openpyxl中導入iter_rows()的方法。 當我們使用以下代碼: import openpyxl as op ms = op.load_workbook(mtest.xlsx) ws = ms.active op.worksheet.Worksheet.iter_rows() 然…

市直系統推薦市級以上表彰的_推薦市級以及以上教學方面表彰的細則

推薦市級以及以上教學方面表彰的細則為了客觀、公正、合理地評價教師的德、才表現和工作實績,用制度來激勵、督促全體教職工提高政治和業務索質,認真履行好自身工作職責。避免人為因素,增強評優的透明度,有利于調動廣大教職工工作…

react全局狀態管理_react狀態管理redux

Redux(上)結合阮老師的技術博客,將自己吸收到的內容做了個整理:曾經有人說過這樣一句hua : 如果你不知道是否需要Redux,那就是不需要它。從組建層面考慮,什么樣子的需要redux;某個組件的狀態需要共享,某個狀…

edges2shoes數據集下載_edges2cats

edges2cats是一款十分有趣味的生成貓咪的游戲,在這款游戲是以多種不同的圖形相結合,來生成你所想要生成的畫面,游戲的玩法非常的有趣,感興趣的可以試玩哦!edges2cats游戲怎么玩 玩法介紹首先清除畫面,根據你…

單片機機器周期怎么計算公式_單片機定時器周期計算公式

定時器是單片機的重要功能模塊之一,在檢測、控制領域有廣泛應用。定時器常用作定時時鐘,以實現定時檢測,定時響應、定時控制,并且可以產生ms寬的脈沖信號,驅動步進電機。定時和計數的最終功能都是通過計數實現&#xf…

mac 下mysql工具_mysql之工具的使用總結(mac版本)

13.mysql Mac終端操作12.MySql在Mac上的安裝與配置詳解;11.mac下安裝mysql5.7.18,連接出現Access denied for user rootlocalhost (using password: YES)13.mysql Mac終端操作1.啟動mysql :brew services start mysql2.登陸mysql : mysql -u…

sqoop同步時間戳到mysql_在sqoop導入中使用24小時時間戳

我想從使用自由格式查詢的oracle導入數據,并且需要以24小時格式存儲時間戳。在sqoop導入中使用24小時時間戳sqoop import --connect jdbc:oracle:thin:(server credntials) \--username ***** --password ***** \--query "select emp_uid, emp_name, salary, t…

mysql權限系統的工作原理_Mysql權限系統工作原理

MySQL權限系統保證所有的用戶可以嚴格地做他們假定被允許做的事情。當你連接一個MySQL服務器時, 你的身份由你從那連接的主機和你指定的用戶名來決定,系統根據你的身份和你想做什么來授予權限。MySQL在認定身份中考慮你的主機名和用戶名字,是…

mysql日志文件的類型和作用_Mysql日志文件和日志類型介紹_MySQL

日志文件類型MySQL有幾個不同的日志文件,可以幫助你找出mysqld內部發生的事情:日志文件記入文件中的信息類型錯誤日志記錄啟動、運行或停止mysqld時出現的問題。查詢日志記錄建立的客戶端連接和執行的語句。更新日志記錄更改數據的語句。不贊成使用該日志…

ruby mysql 驅動_windows下Rails安裝MySql驅動的配置

1.安裝ruby這我就不廢話了,安裝很簡單,網上資料也很多。安裝完后再環境變量path里加入D:ruby\bin(視你的安裝路徑了)安裝完后在命令行輸入ruby -v, 會顯示版本號,表示安裝成功,我的版本號是1.8.62.安裝rails我建議去官…

cross join 一張表沒有值關聯不出來數據_你是否還在對left join、right join和join有困擾呢?...

說到SQL,很多人可能用了挺久,但依然有個問題一直困擾著,那就是 left join、 join、 right join和 inner join等等各種 join的區別。網上搜,最常見的就是一張圖解圖,如下:接下來就來實際自己動手實驗&#x…

MySQL如何修改表的儲存方式_修改mysql默認存儲引擎的方法

修改mysql默認存儲引擎的方法,供大家學習參考。先來了解一下mysql存儲引擎:mysql服務器采用了模塊化風格,各部分之間保持相對獨立,尤其體現在存儲架構上。存儲引擎負責管理數據存儲,以及mysql的索引管理。通過定義的AP…

前端判斷是否安裝桌面應用_前端開發人員的桌面應用神器 Electron

01為什么用 JavaScript 來開發桌面應用?曾經的 JavaScript 脆弱、簡陋、甚至有被邊緣化的危險,不過 JavaScript 在經過了兩次飛躍后(以 V8 為首的 JavaScript 引擎和 Node.js 的問世),不再受人欺負,早已升級…

mysql 導出csv 多列_從包含300多列的csv,txt或xls文件創建MySQL表

你可以用一些langague C ,PHP解析txt文件......然后構建一個請求并執行它。PHP和PDO :: module將使這個最簡單。我不知道某個程序是否已經完成這項工作。這是一個解決方案。如果您選擇這樣做并遇到麻煩,歡迎您。每個stackoverflow成員都會幫助您。編輯&a…

mysql error 1594_【MySQL】解決mysql的 1594 錯誤-阿里云開發者社區

對于主從架構的mysql,當發生主機斷電或者其他原因異常crash的時候, slave的容易發生讀取binlog出錯的問題,最常見的是show slave status \G;Master_Log_File: mysql-bin.000029Read_Master_Log_Pos: 3154083Relay_Log_File: relay-bin.000478Relay_Log_Pos: 633Rel…

mysql innodb文件_MySQL的InnoDB文件介紹

MySQL一個顯著的特點是其可插拔的存儲引擎,因此MySQL文件分為兩種,一種是和MySQL數據庫本身相關 的文件,一種是和存儲引擎相關的文件。本文主要介紹和InnoDB存儲引擎相關的文件。表空間文件InnoDB在存儲上也模仿了Oracle的設計,數…

python中與label類似的控件是_python中tkinter的使用(控件整理)(一)

1、使用tkinter.Tk() 生成主窗口(windowtkinter.Tk()):window.title(標題名)修改框體的名字,也可在創建時使用className參數來命名;window.resizable(0,0)框體大小可調性,分別表示x,y方向的可變性;1表示可變,0表示不可…