0

この 1 週間ほど、コンピューターの動作をより深く理解するために、64 ビット Windows 7 マシンで x86 アセンブリ言語を学ぼうとしてきました。

残念ながら、多くのアセンブラでは高レベルの構造体とマクロの使用、および事前に作成されたコードの組み込みが許可されているため、私はほとんど進歩していません。これは問題ではありませんでしたが、この件に関して見つけたすべてのドキュメントとチュートリアルが、これらの抽象化、松葉杖、および難読化の使用を主張していることに気付くまでは、真に低レベルの言語を学びたいという私の目的全体を無効にしていました。

そこで今、私は「純粋な」アセンブラまたは言語を探しています。これは、高水準アセンブリ言語の肥大化や粗悪さがなく、可能な限りマシン コードに近いものです。

4

4 に答える 4

2

NASMをご覧ください。

NASMには、定義できる高レベルのヘルパー関数とマクロがたくさんありますが、それらを使用しないようにするのは完全に自由です。

ただし、発生する可能性のある問題の1つは、アセンブリ言語がバイトにコンパイルされることですが、オペレーティングシステムは概してバイトを実行せず、プログラムを実行します。その結果、PEファイル(Windows)またはELFファイル(Linux)を生成するために最終的に決定するアセンブラーを説得するために、ほぼ確実にいくつかの高レベルの構成をいじる必要があります。

于 2013-02-03T09:29:36.380 に答える
2

x86 マシン コードを 16 進エディターで直接記述します。

それは完全に可能です、私は何度もそれをしました。しかし、特に1000回目のジャンプオフセットを手動で再計算する必要がある場合は特に、これらの「抽象化、松葉杖、難読化」の価値をすぐに学ぶでしょう....

于 2013-02-03T09:20:42.500 に答える
1

純粋なアセンブリコードについては、いくつかの基本的なhelloworldブートローダーを見ることができます。ブートローダーはオペレーティングシステムコールに依存しませんが、BIOSコールに直接依存します。この基本的なチュートリアルを例としてhttp://viralpatel.net/taj/tutorial/hello_world_bootloader.phpで見ることができます。これは16ビットアセンブリです。

于 2013-02-03T22:05:49.573 に答える
1

「純粋」にはいくつかのレベルがあります。たとえば、特定の OS を使用する場合、入出力やメモリ割り当てなどを行うためにその API を使用する必要があります。この API 呼び出しは、さまざまな方法で提供されます。簡単なものもあれば、そう簡単ではないものもあります。

たとえば、Windows で作業している場合、システム DLL から関数をインポートする必要があります。ただし、関数のインポートは「アセンブリ プログラミング」と見なすことはできません。

これらの関数の呼び出し規約は C/C++/HLL であるため、アセンブリに似たものではなく、この呼び出し規約を使用する必要があります。

したがって、最初に OS が必要です。それはアセンブリに適しています。32 ビット Linux をお勧めします。これは int $80 を使用し、パラメーターの受け渡しを登録するため、アセンブリ言語に集中できます。

これは、FASM で書かれた非常に単純な「hello world」の例です。ご覧のとおり、オーバーヘッドは非常に小さく、関連するマクロはありません。

format ELF executable
entry _start

segment readable executable
_start:

        mov     eax, 4
        mov     ebx, 1
        mov     ecx, msg
        mov     edx, msg_size
        int     $80

        mov     eax, 1
        xor     ebx, ebx
        int     $80


segment readable writeable
msg db 'Hello world!',$0a
msg_size = $ - msg

もちろん、いくつかの Linux システム コールのマニュアルが必要になります。Linux x86 Asm ソフトウェア開発キットはまさにあなたが必要としているものです。

于 2013-02-03T16:37:09.153 に答える