2009-01-17 44 views
11

在學校,我們一直在用MIPS彙編語言進行編程。我有興趣鑽研x86彙編,我聽說這有點難(甚至我的MIPS教科書也這麼說)。從MIPS切換到x86彙編時應該知道什麼?

在深入x86世界之前,我應該知道哪些核心信息作爲MIPS程序員?

回答

14

要記住最重要的事情是:

  • 很少通用寄存器,並且你有哪些不是純粹的GP - 許多指令要求使用特定的寄存器用於特定目的。
  • x86指令是雙操作碼形式而不是三操作碼,它可以使某些操作更加複雜。也就是說,不是添加r0,r1,r2(r0 = r1 + r2),而是添加eax,ebx(eax + = ebx)。
  • 保護模式下的段(DOS以外的所有32位代碼,有效地)使你的內存尋址方案非常不明顯,當你開始時它可以咬你。
  • 您將一直在查看通過指令設置/清除的標誌。學習愛英特爾手冊。
  • 編輯,我忘了一件事:使用子寄存器(例如ah來訪問eax寄存器的低16位的高8位)可以使對寄存器的跟蹤操作變得非常困難。小心並且大膽地評論,直到你把事情弄糟。

除此之外,x86非常簡單。當你學會濫用像'lea'和'test'這樣的指令時,你會學會去愛它。此外,protip:英特爾會免費向您發送指令集手冊的副本,甚至無需支付運費。瀏覽他們的網站以獲得履行電子郵件並通過SKU索取書籍。

5

與大多數其他體系結構相比,x86的可用寄存器集非常有限。這並不能真正使彙編語言學得更難,但有時會使實現代碼變得更加困難。另外,由於x86具有強大的向後兼容性的歷史,指令集不是非常對稱的(絕對是RISC之前的),並且可能有很多例外情況需要注意規則和邊界情況。

+0

是的,但與MIPS相比並不是那麼有限。 :) – BobbyShaftoe 2009-01-17 21:34:15

+3

@BobbyShaftoe,你是程序員嗎?據我所知,MIPS有32個通用寄存器,x86有8個。 – mmcdole 2009-01-17 21:41:10

1

x86比MIPS擁有更復雜的指令。所以在MIPS中可能有一條指令用於共同序列(最顯着的是內存尋址)。缺少大量的寄存器肯定是一個缺點,但是在兩種體系結構中都有一些約定,這些約定幾乎將可以自由使用的數量限制在4-5之間。在x86中更加明顯。對於註冊表使用情況,x86比MIPS有更多的例外,你必須記住,但是沒有什麼值得一直抱怨的。

從經驗說起,任何一種語言都有相同的學習難度,包括慣例。考慮到豐富的在線資源及其受歡迎程度,也許x86更容易一點。

關於x86的難點在於生成二進制,因爲它的可變長度指令和幾種尋址模式。大多數情況下,你永遠不需要這樣做。

我當然可以推薦你學習比MIPS更復雜的指令體系結構。

而且,這很重要,不要成爲RISC訴諸宗教戰爭的一部分。 CISC ...

1

我一直在學習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。我們也很高興地注意到沒有寄存器間接的有條件跳轉,它也困擾着我。

這裏是不是一切可能,你應該知道,但第一個東西,進入我的腦海從你的問題。但也許你現在可以與這些相處。