2011-10-21 5 views
7

私は2.53 GHzのIntel Core 2 Duoプロセッサ搭載のMacBook Proを使用していますが、MacユーザーはAT & T構文を従わなければならないと言われました(これはIntelを実行しているので混乱します)。 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()); 
} 

そして、最後に小さな質問3つ:

  1. .s.hファイル名(私は1つは、何のためにあるmain.cmain.h、両方を持っている)の違いは何ですか?

  2. なぜアセンブリには、それと一緒に行くにはmain.cが必要ですか/どのように呼びますか?

  3. 誰もがEclipseのような優れた組立IDEはJavaやPHP誰の答えに

おかげで(これは実際にはこのサイト上の私の最初の投稿です)、私がしようとしてきたためであるお勧めしますこれを数日間把握し、私が読んだすべてのリソースはアセンブリロジックを私に説明していません。それは.dataまたは.textが何を言いますが、彼らが何を意味するかを理解するであろう「アセンブリが考える」方法を知っているだけで誰か? また、誰かがニューヨーク市の周りにいて、AssemblyやCでとても気分が良ければ、プライベートレッスンが大好きです。私はこの言語には多くの可能性があり、それを学びたいと思っています。

+0

参照:http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html –

+1

「nasm」には最新バージョンのXcodeが付属しています。これをインテルの構文で使用することができます。 Wikibooksには[x86アセンブリの書籍](https://en.wikibooks.org/wiki/X86_Assembly)もあります。 –

+0

どのようなアプリケーションを作成する予定ですか? –

答えて

8

アセンブリ言語は、CPUアーキテクチャに密接に関連するプログラミング言語のカテゴリです。従来は、各アセンブリ命令と結果のCPU命令との間に1対1の対応があります。

CPU命令に対応しないアセンブラまたは生成されたコードに影響する疑似命令もあるアセンブリがあります。 .dataおよび.textは疑似命令です。

これまで、各CPU製造元は、アセンブラのソースコード変換ユーティリティで定義されているアセンブリ言語を実装していました。数千の特定のアセンブリ言語が定義されています。

現代では、各アセンブリ言語は、特に擬似命令に関して多くの共通機能を共有していることが認識されています。 GNUコンパイラコレクション(GCC)は基本的にすべてのCPUアーキテクチャをサポートしているため、汎用アセンブリ機能が進化しています。

x86は& T構文 ATインテル8086ファミリ(8088、8086、8087、80186、80286、80386、80486、80586のPentiumなどのPentium II、別名80686別名)

を指しています多くのアセンブリ言語アーキテクチャで使用される表記法スタイル。主な特徴は、命令オペランドが、歴史的に一般的であったように、から、の順番で書き込まれることです。 インテル構文は、から、からオペランドを使用します。他にも違いがあります。ここにあなたの多くの質問については

は、1)あなたを圧倒しますいくつかのリソースであり、2)最終的にはすべてのあなたの答えを提供:

通常、 ssembly言語のプログラミングクラスは、十分な実践的な作業を伴うフルセメスターです。これは、あなたがコンピュータアーキテクチャの基礎を熟知していることを前提としています。上記の資料の理解には300〜500時間かかることが予想されるのは合理的です。がんばろう!

関連する問題