2011-10-21 51 views
7

我使用的是帶有2.53 GHz Intel Core 2 Duo處理器的MacBook Pro,但我被告知Mac用戶必須遵循AT & T語法(這增加了我運行英特爾以來的困惑)並且x86(不知道這意味着什麼)。在Mac上使用裝配

所以我需要進入組裝,但我很難開始。搜索在語法上差別很大的在線顯示彙編代碼,我無法找到解釋基本彙編操作的任何資源。我一直在閱讀關於寄存器和棧的內容,但不知道如何看待這個。任何人都可以向正確的方向解釋/指出我嗎?舉例來說,這個代碼是我發現的唯一代碼:

.data 
_mystring: .ascii "Hello World\n\0" #C expects strings to terminate with a 0. 
.text 
    .globl _foo 
_foo: 
push %ebp 
    mov %esp,%ebp 
    pushl $_mystring 
    call _myprint 
    add $4,%esp 
    pop %ebp 
    ret 

非常簡單,但它是什麼意思?我有一個令人困惑的時間瞭解這段代碼如何執行它的功能。我瞭解Java,PHP和C以及其他語言,但是,它的步驟和語法並不清楚。這裏的主文件去用它:

#include <stdio.h> 
void foo(); 
void myprint(char *s) 
{printf("%s", s);} 
main() 
{foo();} 

此外,還有這個剛剛乘號:

.data 
    .globl _cntr 
_cntr: .long 0 
    .globl _prod 
_prod: .long 0 
    .globl _x 
_x: .long 0 
    .globl _y 
_y: .long 0 
    .globl _mask 
_mask: .long 1 
    .globl _multiply 
multiply: 
    push %ebp 
    mov %ebp,%esp 
    mov $0,%eax 
    mov _x,%ebx 
    mov _y,%edx 
LOOP: 
    cmp $0,%ebx 
    je DONE 
    mov %ebx,%ecx 
    and $1,%ecx 
    cmp $1,%ecx 
    jne LOOPC 
    add %edx,%eax 
LOOPC: 
    shr $1,%ebx 
    shl $1,%edx 
    jmp LOOP 
DONE: 
    pop %ebp 
    ret 

和main.c中去用它:

#include <stdio.h> 

extern int multiply(); 
extern int x, y; 

int main() 
{ 
    x = 34; 
    y = 47; 
    printf("%d * %d = %d\n", x, y, multiply()); 
} 

而且最後三個小問題:

  1. .s.h文件名(我有一個main.cmain.h,哪一個是爲了什麼)有什麼區別?

  2. 爲什麼裝配需要main.c去配合它/它是如何調用它?

  3. 誰能推薦一個良好的裝配IDE像Eclipse是一個用於Java或PHP

感謝任何人的回答(這實際上是我在這個網站的第一篇文章),我一直在努力弄清楚了幾天,我讀到的每一個資源都沒有向我解釋彙編邏輯。它說什麼.data.text做,但只有知道如何「思考彙編」的人會明白他們的意思? 另外,如果有人在紐約市附近,感覺自己對Assembly和C很舒服,我會喜歡一些私人課程。我覺得這種語言有很大的潛力,並且很想學習它。

+0

請參閱:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html –

+1

'nasm'附帶最新版本的Xcode。您可以使用英特爾語法。 Wikibooks也有一個[x86 Assembly book](https://en.wikibooks.org/wiki/X86_Assembly)。 –

+0

你打算寫什麼樣的應用程序? –

回答

8

彙編語言是一類與CPU體系結構密切相關的編程語言。傳統上,每個彙編指令與所產生的CPU指令之間存在一一對應關係。

還有彙編僞指令它們不對應CPU指令,而是影響彙編程序或生成的代碼。 .data.text是僞指令。

從歷史上看,每個CPU製造商都實現了彙編語言,彙編語言的編譯器彙編器是一個源代碼翻譯工具。已經定義了數千種特定的彙編語言。

在現代,人們已經認識到每個彙編語言都有許多共同的特徵,特別是在僞指令方面。 GNU編譯器集合(GCC)基本上支持每種CPU架構,因此它已經發展出通用匯編功能。

x86指的是英特爾8086系列(8088,8086,8087,80186,80286,80386,80486,80586又名奔騰,80686又名奔騰II等)

AT & T語法是符號風格被許多彙編語言體系結構所使用。一個主要的特點是,指令操作數的編寫順序是從,這在歷史上是很常見的。 英特爾語法使用來自操作數。還有其他的不同之處。

至於你的很多問題,這裏有一些資源,這將1)壓倒你,和2)最終提供所有的答案:

通常,介紹一個大型語言程序設計課程是一個完整的學期,有大量的實踐工作。它假定您熟悉計算機體系結構的基礎知識。期望理解上述材料需要300-500小時是合理的。祝你好運!