讀筆 匯編語(yǔ)言-基于Linux環(huán)境(第5章-匯編的權(quán)利:匯編語(yǔ)言的創(chuàng)建過(guò)程)

文章也同時(shí)在個(gè)人博客 http://kimihe.com/更新

引言

本章介紹匯編語(yǔ)言程序的創(chuàng)建過(guò)程,我們要準(zhǔn)備踏上創(chuàng)作匯編程序之路啦~
仍舊如之前所說(shuō)的,越了解底層,就越能夠駕馭計(jì)算機(jī)。

摘要

  • 所有的匯編過(guò)程都是處理文件的過(guò)程。
  • 程序就是一個(gè)由非常小的步驟組成的漫長(zhǎng)旅途,這些步驟是一個(gè)代表機(jī)器指令的二進(jìn)制值的列表。

二進(jìn)制文件 vs. 文本文件

  • 機(jī)器上文件可以分為:文本文件(text file)和二進(jìn)制文件(binary file)。
  • 二進(jìn)制文件可以使用Linux命令:> xxd file來(lái)查看,你需要直到打印出來(lái)的內(nèi)容各字段的含義。如下輸出:
$ xxd aa
00000000:   610a 620a 630a 640a 650a 660a 670a 680a   a.b.c.d.e.f.g.h.
00000010:   300a 310a 320a 330a 340a 350a 360a 370a   0.1.2.3.4.5.6.7.
00000020:   380a 390a

可以看到輸出有三列,最左側(cè)的00000000等數(shù)字代表偏移量,它包含顯示那一行的第一個(gè)字節(jié)與文件開(kāi)頭的第一個(gè)字節(jié)的偏移量。中間的以字節(jié)為單位顯示16進(jìn)制內(nèi)容。最右側(cè)顯示可視化文本字符,對(duì)于不可顯字符的二進(jìn)制值采用句號(hào)字符表示。

  • 注意到其中夾雜的0AH,這里它代表?yè)Q行,對(duì)應(yīng)鍵盤的enter(return)。值得一提的是在windows中,這個(gè)按鍵會(huì)產(chǎn)生回車(0DH)+換行(0AH),而Linux中只有換行(0AH)?,F(xiàn)在大多數(shù)計(jì)算機(jī)系統(tǒng)和軟件忽略回車,這是當(dāng)年機(jī)械打字機(jī)的歷史遺留:當(dāng)打字機(jī)一行打滿后,你必須把游標(biāo)移到行首(回車0DH),并切到下一行(換行0AH),這樣才能開(kāi)始新一行的輸入。
  • 在一個(gè)二進(jìn)制可執(zhí)行文件中,位模式可能意味著完全不同的內(nèi)容,這取決于它剛好位于文件中的位置,以及該文件中,它附近存在這哪些其他位模式。

字節(jié)序

  • 對(duì)于字節(jié)順序的解釋可以分為小端法(little endian)大端法(big endian)。一旦使用不止一個(gè)字節(jié)來(lái)代表一個(gè)數(shù)字值,字節(jié)的順序就變得至關(guān)重要。
  • 將多字節(jié)值的最低有效字節(jié)存儲(chǔ)到最低偏移位置的計(jì)算機(jī)體系結(jié)構(gòu)稱為小端系統(tǒng)(little endian)。反之,將多字節(jié)值的最高有效字節(jié)存儲(chǔ)到最低偏移位置的計(jì)算機(jī)體系結(jié)構(gòu)稱為大端系統(tǒng)(big endian)。
  • 在大端系統(tǒng)中的數(shù)據(jù)以16進(jìn)制顯示很容易,因?yàn)樗鼈儼凑杖藗兤诖捻樞虺霈F(xiàn),最重要(高位)的數(shù)在左邊。而在小端系統(tǒng)中,一切都是顛倒的。
  • 字節(jié)排列順序的差異不僅適用于存儲(chǔ)在文件中的字節(jié),而且也適用于存儲(chǔ)在內(nèi)存中的字節(jié)。而最近的硬件體系結(jié)構(gòu)都被設(shè)計(jì)為雙向字節(jié)

編譯器

  • 匯編語(yǔ)言具有非常重要的特征,正是這一點(diǎn),使它在眾多的編譯器中與眾不同,即:完全控制目標(biāo)代碼。
  • CPU有很多機(jī)器指令,其中每一條都有一個(gè)對(duì)應(yīng)的匯編語(yǔ)言助記符。
  • 助記符和它的操作數(shù)整合在一起稱為指令(instruction)

目標(biāo)代碼和連接器

  • 現(xiàn)代匯編編譯器產(chǎn)生的目標(biāo)代碼文件是一種源代碼和可執(zhí)行文件之間的中間步驟,這個(gè)中間步驟是一種叫作目標(biāo)模塊(object module)的二進(jìn)制文件。
  • 目標(biāo)代碼文件本身并不能作為程序運(yùn)行,還需要一個(gè)額外的必要步驟,那就是連接(link)。
  • 目標(biāo)代碼文件作為中間步驟的原因是:大的源代碼文件可以劃分成許多更小的源代碼文件,以保持文件大小和復(fù)雜性 的可管理性。
  • 連接器不只是把目標(biāo)代碼塊組合成一個(gè)單個(gè)的塊,它確保模塊以外的函數(shù)調(diào)用能夠到達(dá)目標(biāo)對(duì)象模塊,并且確保所有此類內(nèi)存引用實(shí)際上指向它們期望引用的地方。

重定位能力

  • 與現(xiàn)代8086一同引入的Intel體系結(jié)構(gòu)內(nèi)部有了很大的改進(jìn),從而使程序無(wú)須被編譯為在特定的物理地址運(yùn)行。可知行文件內(nèi)部的所有引用都通過(guò)相對(duì)于該程序起始位置的偏移量來(lái)指定。
  • 偏移量總是相同的,并且因?yàn)樗械囊枚际窍鄬?duì)于可知行程序文件的起始位置,所以在運(yùn)行時(shí),程序放在物理內(nèi)存中的什么地方都沒(méi)有關(guān)系。
  • 上述特性叫作可重定位能力。

感想

似乎是時(shí)候可以去親手挑選硬件,并組裝一臺(tái)機(jī)器了說(shuō)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容