5

私は、アセンブリで簡単なプログラミングを行う方法を理解しようと試みました。私はチュートリアルの hello world プログラムを調べていますが、彼らが説明したことのほとんどは理にかなっていますが、彼らは本当にそれについて詳しく説明していません。プログラムのいくつかの異なる部分を理解するための助けが必要です。ここに彼らのチュートリアルの例があります -

section .text
    global main     ;must be declared for linker (ld)
main:               ;tells linker entry point
    mov edx,len     ;message length
    mov ecx,msg     ;message to write
    mov ebx,1       ;file descriptor (stdout)
    mov eax,4       ;system call number (sys_write)
    int 0x80        ;call kernel

    mov eax,1       ;system call number (sys_exit)
    int 0x80        ;call kernel

section .data
msg db 'Hello, world!', 0xa  ;our dear string
len equ $ - msg              ;length of our dear string

テキストセクションとデータセクションがあります。データ セクションには、プログラムのユーザー定義情報が保持されているようです。プログラムの「枠」がテキスト部、「肉」がデータ部のようですが…?コンパイル時にプログラムがテキストセクションを実行し、データセクションのデータがテキストセクションに入力されていると思いますか? bss/text/data セクションの相互作用は、私にはなじみのないものです。msg と len.... 変数があるデータ セクションでも?が言及されていますが、その後に、何を確認すればよいかわからない情報が続きます。msg の後に db が続きますが、これはどういう意味ですか? 次にテキスト、そして 0xa です。0xa は何のためのものですか? また、len の後に equ が続きますが、これは equals という意味ですか? len は、dollarsign から msg 変数を引いたものですか? ドル記号とは何ですか? 一種のオペレーター?テキストセクションの指示も、mov ebx,1 どうやら、またはプログラムに STDOUT を使用するように指示しているようですか? ebx レジスタに 1 を移動することは、stdout を設定するための標準的な命令ですか?

おそらく、誰かが推奨するもう少し完全なチュートリアルを持っていますか? 私はアセンブリで汚れることを探しており、必要に応じて「コアの基礎」のいくつかを自分自身に教える必要があります。助けてくれてありがとう!

4

1 に答える 1

15

[注意 - どのアセンブラ方言を使用しているかはわかりません。そのため、この内容の一部について「最善の推測」を行っただけです。誰かが明確にするのを助けることができれば、それは素晴らしいことです.]

プログラムの「枠」がテキスト部、「肉」がデータ部のようですが…?

テキストセクションには、プログラムを構成する実行可能な命令が含まれています。データセクションには、プログラムが操作するデータが含まれています。2 つの異なるセクションがある理由は、プログラム ローダーとオペレーティング システムが何らかの保護を提供できるようにするためです。たとえば、テキスト セクションは読み取り専用メモリにロードでき、データ セクションは「実行不可」としてマークされたメモリにロードできるため、その領域からコードが誤って (または悪意を持って) 実行されることはありません。

コンパイル時にプログラムがテキストセクションを実行し、データセクションのデータがテキストセクションに入力されていると思いますか?

プログラム (テキスト セクションの命令) は通常、シンボルを参照し、データ セクションのデータを操作します。

bss/text/data セクションの相互作用は、私にはなじみのないものです。

BSS セクションはデータ セクションと似ていますが、すべてゼロで初期化されています。つまり、実行可能ファイルで実際にスペースを占有する必要はありません。プログラムローダーは、メモリ内に適切なサイズのゼロバイトのブロックを作成するだけです。プログラムに BSS セクションがありません。

msg と len.... 変数があるデータ セクションでも?が言及されていますが、その後に、何を確認すればよいかわからない情報が続きます。msg の後に db が続きますが、これはどういう意味ですか?

msgはい、len一種の変数です。 msgは、後続の文字列を指すグローバル変数です。db手段はdata byte、アセンブラが後続のリテラル バイトを出力する必要があることを示します。 len文字列の長さに設定されています(詳細は以下)。

次にテキスト、そして 0xa です。0xa は何のためのものですか?

0x0aASCII 改行文字の 16 進値です。

また、len の後に equ が続きますが、これは equals という意味ですか?

はい。

len は、dollarsign から msg 変数を引いたものですか? ドル記号とは何ですか? 一種のオペレーター?

$は「現在地」という意味です。アセンブラがその仕事を進めているとき、カウンターで生成されたデータとコードのバイト数を追跡​​します。したがって、このコードは次のように言っています:「msg現在の場所からラベルの場所を差し引き、その番号をlen「「現在の位置」は文字列の末尾を少し過ぎたところにあるため、そこの長さを取得します。

また、テキストセクションの指示、 mov ebx,1 どうやら、またはプログラムにSTDOUTを使用するように指示しているようです? ebx レジスタに 1 を移動することは、stdout を設定するための標準的な命令ですか?

int 0x80プログラムは、命令を介してシステム コールを行っています。その前に、OS が期待する方法で物事を設定する必要があります。この場合は、他の 3 つのレジスタと共に1inebx1を意味するように見えます。メッセージの長さ in 、メッセージへのポインタ in 、およびシステムの請求番号。あなたは Linux を使っていると思いますが、Google からシステム コール テーブルを探すのに苦労することはないと思います。stdoutedxecxeax

おそらく、誰かが推奨するもう少し完全なチュートリアルを持っていますか?

申し訳ありませんが、私の頭の上ではありません。

于 2013-06-12T20:45:46.630 に答える