在學校,我們一直在用MIPS彙編語言進行編程。我有興趣鑽研x86彙編,我聽說這有點難(甚至我的MIPS教科書也這麼說)。從MIPS切換到x86彙編時應該知道什麼?
在深入x86世界之前,我應該知道哪些核心信息作爲MIPS程序員?
在學校,我們一直在用MIPS彙編語言進行編程。我有興趣鑽研x86彙編,我聽說這有點難(甚至我的MIPS教科書也這麼說)。從MIPS切換到x86彙編時應該知道什麼?
在深入x86世界之前,我應該知道哪些核心信息作爲MIPS程序員?
要記住最重要的事情是:
除此之外,x86非常簡單。當你學會濫用像'lea'和'test'這樣的指令時,你會學會去愛它。此外,protip:英特爾會免費向您發送指令集手冊的副本,甚至無需支付運費。瀏覽他們的網站以獲得履行電子郵件並通過SKU索取書籍。
與大多數其他體系結構相比,x86的可用寄存器集非常有限。這並不能真正使彙編語言學得更難,但有時會使實現代碼變得更加困難。另外,由於x86具有強大的向後兼容性的歷史,指令集不是非常對稱的(絕對是RISC之前的),並且可能有很多例外情況需要注意規則和邊界情況。
x86比MIPS擁有更復雜的指令。所以在MIPS中可能有一條指令用於共同序列(最顯着的是內存尋址)。缺少大量的寄存器肯定是一個缺點,但是在兩種體系結構中都有一些約定,這些約定幾乎將可以自由使用的數量限制在4-5之間。在x86中更加明顯。對於註冊表使用情況,x86比MIPS有更多的例外,你必須記住,但是沒有什麼值得一直抱怨的。
從經驗說起,任何一種語言都有相同的學習難度,包括慣例。考慮到豐富的在線資源及其受歡迎程度,也許x86更容易一點。
關於x86的難點在於生成二進制,因爲它的可變長度指令和幾種尋址模式。大多數情況下,你永遠不需要這樣做。
我當然可以推薦你學習比MIPS更復雜的指令體系結構。
而且,這很重要,不要成爲RISC訴諸宗教戰爭的一部分。 CISC ...
我一直在學習x86和x86_64編寫自己的彙編程序。如果你不打算自己編寫彙編程序,那麼我會說的一些東西幾乎沒用。儘管我自己不瞭解MIPS。
x86間接尋址是一件複雜的事情。在一個單一的指令,你可以做這些:
mov reg, [reg+offset]
mov reg, [reg*scale+base register+offset] # in where scale can be 1, 2, 4 or 8.
他們的指令編碼就是因爲這個複雜的,但它是爲每一個編碼這樣的指令是一致的。您可能想從sandpile.org讀取此內容。如果你想了解更多關於編碼的知識,你可以隨時向我諮詢。另一個編碼相關惱人細節的指令是前綴。他們改變了教學的意義。例如,前面的0x66(如果我沒記錯的話),一些指令會變成16位GPR而不是32位GPR。
32位GPRS(按順序):EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
64位的GPR:RAX,RCX,RDX,RBX,RSP,RBP,RSI,RDI,R8 ,r9,r10,r11,r12,r13,r14,r15
注意這裏有很少的通用寄存器,這會迫使大多數軟件或多或少地以疊加機器的方式使用它。一個痛苦的細節。 rsp用於堆棧(pop,push-instructions),並且rbp也傾向於保留。 x86_64擁有更多的寄存器,但即使每個消費者都擁有能夠支持它的處理器,人們也會採用它。
有兩種不同的浮點運算指令集。 XMM是最新的。在x86_64中,有16個128位寄存器可用,x86中只有8個。舊指令集將寄存器處理爲堆棧。你只是沒有交換,咬或腐爛,所以使用它是令人費解的。
在使用中x86往往會減少到RISC機器中。其中一些複雜的指令不會在新機器上帶來好處,甚至會更慢。您將根據您正在閱讀或寫作的內容瞭解30-150條說明。你也可以完全忽略一些舊的指令和AL/HL-stuff。請記住,這是1978年背後的所有混亂起因,令人驚訝的是它不會更糟,從第一次推出IA-32起的31年和24年就是這樣。很多事情在那個時候改變了他們的相關性。
直接跳轉和調用似乎是在x86的下一條指令相對。因此:
jmp nowhere # or call, jz, jg whatever...
nowhere:
nop
結束編碼爲'JMP imm:0,NOP'。絕對跳轉的寄存器間接jmp。我們也很高興地注意到沒有寄存器間接的有條件跳轉,它也困擾着我。
這裏是不是一切可能,你應該知道,但第一個東西,進入我的腦海從你的問題。但也許你現在可以與這些相處。
是的,但與MIPS相比並不是那麼有限。 :) – BobbyShaftoe 2009-01-17 21:34:15
@BobbyShaftoe,你是程序員嗎?據我所知,MIPS有32個通用寄存器,x86有8個。 – mmcdole 2009-01-17 21:41:10