2013-11-03 43 views
1

我在教導自己/閱讀有關程序集。大多數關於彙編的書籍都是指x86-代碼中的所有寄存器名稱都以「e」開頭,而不是「r」(就像在x86-64中那樣)。但是,我使用64位Linux,並且想知道這些書是否具有任何價值,因爲它們不是指x86-64。使用x86材料在64位操作系統上學習彙編?

所以總之,真的值得我使用這些資源來學習x86-64。或者,除了寄存器命名規則的不同之外,還有不同的改寫 - 這兩者之間是否存在其他差異,這些差異可能導致x86材料的學習困難?

+1

調用約定會有所不同,其他差異是微不足道的。 – harold

+0

除了調用約定之外,還有一點需要記住的是,使用32位寄存器作爲目標寄存器總是將相應的64位寄存器的前32位清零。還有一些其他問題。並非所有的32位指令(甚至是相對常見的指令)都是有效的64位指令,請參閱我的(已關閉)問題http://stackoverflow.com/questions/11897116/how-to-convert-linux-32-bit-gcc -inline-assembly-to-64-bit-code。 – nrz

回答

4

64位Linux允許運行32位應用程序,因此您仍然可以在您的計算機上創建32位應用程序。這樣,書籍和示例32位代碼就完全有用。

如果程序集應用程序動態鏈接到某個32位共享庫,則可能只有一個問題。爲了解決這個問題,你應該安裝32位兼容層。

僅使用Linux系統調用的彙編程序在沒有該層的情況下工作正常,實際上這是爲32位編譯的共享庫的集合。

順便說一句,在我看來,編寫32位代碼仍然更好,如果你想讓你的程序對更多人有用。周圍還有很多32位電腦,它們不會很快消失。

+1

你也應該知道,由於更復雜的調用約定(不是基於堆棧,特殊的堆棧指針對齊,...),64位彙編器更難學。所以寫32位對初學者來說肯定更好。 –

0

由於調用約定和堆棧管理更簡單,因此在32位學習彙編的確更容易一些。

在64位上,您需要擔心ABI。不僅如此,每個操作系統的約定都不一樣。例如,Mac OS X上的ABI規則與Windows上的規則不同(寄存器不一樣,在Windows上它只使用4個寄存器)。

您可以使用-arch i386和彙編程序(as)來編譯彙編代碼。使用clang或gcc,你可以使用-m32(至少在Mac OS X上,因爲我沒有在Linux上使用它)。您將無法鏈接具有不同位數的模塊(32位與64位)。

一旦你準備好切換或編譯你的64位程序,你將不得不確保當你處理堆棧時,你需要推送64位單詞而不是32位單詞,但這種說法有道理。

相關問題