3

アセンブリの学習を開始するのに適した場所を見つけるのに苦労しています。アセンブリが実際に何であるか、どのアセンブラを使用するか、アセンブラとは何か、特定のCPUファミリ用にIntelによってリリースされた「コア」アセンブリ言語が1つあるかどうかについて、インターネット全体で多くの矛盾する情報を見つけました(私はIntelを持っていますx86 CPUなので、アセンブリを学びたいと思っています)。

上記のトラブルについて教えてください。私が聞いたところによると、Intelは命令セット/リファレンスを備えたCPUファミリ(たとえばx86)をリリースし、さまざまなアセンブラプログラム(MASM、FASM、NASMなど)は、作成に使用されるより高いレベルの人間が読める言語を提供しますマシンコード命令。

また、私が聞いたところによると、誰かが「アセンブリ言語」と言うとき、これは実際には、そこにある多くの異なるアセンブラによって提供される多くの異なるスタイルのアセンブリ言語の1つを指します。 http://en.wikipedia.org/wiki/X86_assembly_language#ExamplesMASM スタイルのアセンブリとNASMスタイルのアセンブリ

私が探しているのは、MASM、NASMなどが提供するバリエーション(マクロの大規模なライブラリなど)のない「最初の」アセンブラです。これらのアセンブラーはすべてどこかから来たに違いありません。それが私が探しているものです。

基本的に、MASM、NASMなどの前に最初のx86アセンブラー/アセンブリ言語を探しています。誰かがこの最初のアセンブラーへのリンクを教えてくれませんか?

ところで、アセンブリに関する私のロジック全体が間違っている場合は、誰かが明確にすることができます!

前もって感謝します、

Prgrmr

4

4 に答える 4

7

衒学的に言うと、CPU と直接対話するために使用する実際の言語はマシン コードです。これは、特定の命令に使用する必要がある実際のバイト値を把握することを意味します。これは明らかに退屈でエラーが発生しやすいため、代わりにアセンブラを使用します。アセンブラは、マシンコードのテキスト表現をマシンコード自体に変換し、相対アドレスの計算などのさまざまな面倒な詳細を処理します。

特定のマシン コードに対して、さまざまなアセンブラが多数存在する可能性があり、それぞれがアセンブリの記述方法について独自の考えを持っています。これは特に x86 プロセッサに当てはまります。大きく分けて、Intel と AT&T の 2 つのスタイルがあります。そして、それらの中で、さまざまなアセンブラーがさまざまなマクロやディレクティブのセットなどを持つことができます。

説明のために、C コードから生成されたアセンブリのサンプルを以下に示しますgcc -S -masm=intel

    cmp     eax, ebx
    jl      .L63
    mov     eax, DWORD PTR inbuffd
    mov     DWORD PTR [esp+8], 8192
    mov     DWORD PTR [esp+4], OFFSET FLAT:inbuf
    mov     DWORD PTR [esp], eax
    call    read
    cmp     eax, -1
    mov     ebx, eax
    mov     DWORD PTR inbytes, eax
    je      .L64
    test    eax, eax
    je      .L36
    mov     eax, 1
    xor     edx, edx
    jmp     .L33

そして、これは で生成された同じスニペットgcc -S -masm=attです:

    cmpl    %ebx, %eax
    jl      .L63
    movl    inbuffd, %eax
    movl    $8192, 8(%esp)
    movl    $inbuf, 4(%esp)
    movl    %eax, (%esp)
    call    read
    cmpl    $-1, %eax
    movl    %eax, %ebx
    movl    %eax, inbytes
    je      .L64
    testl   %eax, %eax
    je      .L36
    movl    $1, %eax
    xorl    %edx, %edx
    jmp     .L33

これら 2 つのスニペットは同じマシン コードを生成します。違いはアセンブリ構文のみです。特に、引数の順序の違い (Intel は宛先が先、AT&T はソースが先)、命令名のわずかな違い、%AT&T でレジスタを指定するための の使用などに注意してください。

そして、さまざまな CPU があります。CPU には特定のアーキテクチャがあります。つまり、そのアーキテクチャの命令セットを実行します。そのアーキテクチャには、コア命令セットがあり、場合によっては拡張機能または特別なアプリケーション用の追加の命令グループがあります。x86 は良い例です。浮動小数点命令、MMx、3DNow があります。そのアーキテクチャの異なる CPU は、追加の命令を理解できる場合とできない場合があります。一般に、CPU が何をサポートしているかを CPU に問い合わせる方法があります。

「x86 アセンブリ」と言うとき、「x86 アーキテクチャの任意の CPU で実行されるアセンブリ」という意味を理解する人がいます。

より洗練された CPU - 特にメモリ管理 (x86 を含む) を備えた CPU は、単に命令を実行するだけではありません。80286以降、x86 アーキテクチャには、リアル モードとプロテクト モードの 2 つのメイン モードがあります。コア命令セットはどちらのモードでもそのまま使用できますが、各モードでメモリが機能する方法は完全に異なるため、どちらのモードでも機能する実際のコードを試して書くことは実際的ではありません。

後の CPU では、より多くのモードが導入されました。386 は仮想 8086 モード(別名 v86 モード) を導入し、プロテクト モードのオペレーティング システムが実際に CPU をリアル モードに切り替えることなくリアル モード プログラムを実行できるようにしました。AMD64 プロセッサは、ロング モードで 64 ビット コードを実行します。

CPU は複数のアーキテクチャをサポートできます。Itanium アーキテクチャは別のアーキテクチャと見なされ、Itanium をサポートする Intel によってリリースされたすべての CPU は x86 もサポートし、それらを切り替えることができます。

x86 ファミリは、おそらくアセンブリ言語の非常に複雑な例です。33 年以上前にさかのぼる、非常に長く複雑な歴史があります。(32 ビット) アプリケーションで使用されるコア命令のマシン コードは、1978 年にリリースされた 8086 のものと同じです。いくつかの改訂が行われ、それぞれに命令が追加されています。

x86 アセンブリを正しく学習したい場合は、次のことを考慮してください。

  • The Art of Assembly Language Programmingには、DOS、Windows、および Linux のそれぞれのエディションがありました。Windows と Linux のバージョンでは、作成者が考案した High Level Assembly (HLA) と呼ばれる言語を使用しています。これは、x86 アセンブリのようなものですが、実際にはそうではありません。これはあなたの好みかもしれませんし、そうでないかもしれません - 厳密には実際のアセンブリではありませんが、概念はすべてそこにあり、後で適切なアセンブリを書くことを学ぶのはたいした努力ではありません. その名誉のために、それはまた、プロセッサアーキテクチャ、BIOS、ビデオなどに関する情報など、アセンブリ関連の資料をたくさん含んでいます.DOSバージョンは、まっすぐなMASM(Intel)アセンブリを教えています.

  • 基礎からのプログラミングは、 Linux での AT&T スタイルのアセンブリを教えます

実際のアセンブラ (無料のもの) については、Windows またはLinuxでMASM32 (intel スタイル) を試してください。asたまたま、Linuxasは Intel または AT&T スタイルのアセンブリをアセンブルします。

x86 アーキテクチャに圧倒され、他のアーキテクチャのアセンブリを学習したい場合は、より小さなもの から始めることを検討してください。

于 2012-05-06T08:09:17.950 に答える
3

Michael Slade の優れた回答に加えて、いくつかの歴史的な情報があります。

最初の x86 アセンブラーは「ASM86」と呼ばれていました。これは Intel によって作成され、当初は Intel の 8 ビット「ISIS」オペレーティング システムで実行されていました。DOS で動作する新しいバージョンは、オンラインのソフトウェア歴史博物館である WinWorld に保存されています。ここで見つけることができます。付属のマニュアル アーカイブには、ASM86 ダイアレクト用の Intel の 1985 リファレンス マニュアルが含まれています。ASSUME、SEGMENT、DB/DW、END などのよく知られたディレクティブや、より高いレベルのマクロをサポートしています。

私がオンラインで見つけた最も古い x86 アセンブリ言語リファレンスは、Intel の MCS-86 マクロ アセンブリ言語マニュアル (1979 年) です。PDF コピーは、BitSavers によってここに保存されています。

オリジナルの ASM86 の設計者の 1 人である Eric Isaacson は、一種の精神的な後継者である A86 を書き続けました。A86 の方言は ASM86 と非常に似ていますが、ASSUME や SEGMENT ディレクティブなど (Eric Isaacson はそれらを「お役所仕事」と呼んでいます) に関する多くの煩わしさが緩和または排除されています。A86 は、OP が求めていると思われるベアメタル アセンブリ言語の精神を提供する点で、ASM86 よりも優れている可能性があります。A86 は 16 ビットのみです。それを実行するには、DOS エミュレーター、または古いバージョンの Windows を実行しているマシンが必要です (私はまだ Windows XP を実行している古い IBM Thinkpad x23 を持っています。DOS ボックスで A86 を問題なく実行しています)。

最後に、 OS/2 Museumの ISIS-2 プラットフォーム上で ASM86 を使用してオリジナルの IBM PC BIOS を構築することに関する興味深いブログ投稿があります。

于 2020-03-27T17:13:40.513 に答える
0

Michael Slades の回答に追加するのは難しいですが、いくつかコメントがあります。

各プロセッサ ベンダーまたはプロセッサ マシン コードの作成者は、そのプロセッサのアセンブリ言語であるニーモニックを使用してこれを行います。通常、元のプロセッサのドキュメントで定義されているアセンブリは、ランチのナプキンであれ、非常に正式できれいなドキュメントであれ、そのプロセッサの「元の」アセンブリ言語です。アセンブラ (ここでは、別の意味で解釈できるため、ここではアセンブリ言語を解析し、理想的にはアセンブリ言語からマシン コードを作成するプログラムとして使用されます) は、コードを適切に作成するために必要な追加項目を含むアセンブリ言語を読み取るように作成されています。プログラマーの作業を容易にするためのいくつかのディレクティブなど (マクロ、equate (定義) など)。

理想的には、新しいプロセッサを作成していて、最初にアセンブラが必要で、その後他の言語 (FORTRAN、BASIC、Pascal、C、現在に至るまで) に必要なあらゆる種類の受け入れを得たい場合 (C は常に必要ですが、今日では明らかにPascal や Basic などは必要ありません)。プロセッサ ベンダーがチップを販売したい場合は、少なくとも何らかの方法でアセンブラーを作成、契約、または奨励する必要があります。8088/8086 に関しては、Intel は独自のツールを持っていましたが、当時は高価で、他のツールの方が人気がありました (microsoft masm、msvc、borland tasm、pascal、tcc、bcc)。私の記憶が正しければ、a86 という無料の優れたアセンブラがありました。x86 用の優れたフリー アセンブラの例として、nasm があります。

Intel x86 は規則よりも少し例外です。元の構文に近い intel 構文と AT&T 構文との間に宗教的な議論があります。gnu binutils は、変更を加えることによってプロセッサ ベンダーを尊重しない傾向があります (個人的には無礼という言葉を使用します)。x86 はデフォルトで AT&T を使用しているため最悪ですが、ツール (一部、おそらくすべて) でインテルをサポートします (他の言語)。たとえば、アセンブラーは長い間セミコロン ';' を使用してきました。行の終わりとそれ以降をマークするのはコメントです。ARM の場合、binutils は確かに新しい行を新しい命令と見なし、@ をコメント マーカーとして使用します。バックエンドを構成するのは個人であることを理解しました。これらの個人がチップ ベンダー自身である場合もあります。これらのことを行っているのは組織化された 1 つのグループではありません。

コメント記号と同様に、さまざまなプロセッサのアセンブラが類似または同じディレクティブを使用してきました。追加のトークンはマシン コードではありませんが、たとえば ORG または .ORG はアドレスを示します。命令をエンコードするためにマシンコードが存在する物理アドレスが必要になる場合があるため、ユーザーは何らかの方法でそのアドレスを示す必要があります。インクルードを含む単一のファイルで、アセンブラの出力が不完全なオブジェクトではなく完全なバイナリであったため、そのアドレスが必要でした。これが、gnu アセンブラー (ガス) に ORG ステートメントが表示されない理由です。gnu アセンブラーはオブジェクトを作成し、アドレス固有の命令が不完全なままになります。アドレスが必要なためと、不明なラベルを解決するためにリンクする必要があるためです。

x86 は、私が学ぶことをお勧めする最後のアセンブリ言語です。それはもっと興味深い歴史の教訓です。プロセッサは非常に進化し、あらゆる段階で変更され、非常に早い段階でマイクロコード化されました (ほとんどのプロセッサはマイクロコード化されていません。x86 は醜いアセンブリ/マシン言語のため、ほとんど競合する必要がありました)。

x86 を持っているからといって、x86 を学ぶ理由にはなりません。プロセッサをピアリングできるツールがある命令セットを学習したいと考えています。確かにデバッガーを使用すればシングル ステップで実行できますが、操作して何でも出力したり、好きな方法で何でも監視したり、さらにはすべてを一度に確認できるロジック シミュレーターを使用したりすることで、アセンブリ言語を学ぶことは、苦痛をはるかに軽減します。痛みが少ないということは、あきらめるのではなく、もっと楽しんで、それに固執するべきだということです。他の言語と同様に基本的なプログラミング スキルが必要ですが、アセンブリを使用すると、すばやく簡単にトラブルに巻き込まれる可能性があります。また、コンピューターなどをクラッシュさせたくありません。(ここでも、asm からシステム コールを作成する必要があると思われる場所に到達した場合は、pcemu、dosbox、

于 2012-05-06T14:36:43.570 に答える
0

コアアセンブラようなものはないと思います。それぞれの方言があります。また、選択する前に、コードを記述したい OS を検討する必要があるでしょう。

これは、どれから始めるかを選択するのに役立つ良い記事のようです: http://webster.cs.ucr.edu/AsmTools/WhichAsm.html

于 2012-05-06T08:11:37.653 に答える