質問

消化できないものがあります。私はいくつかのアセンブラーを学んでいます、そして今私は演説で章にいます。私は解釈のための括弧の概念を理解していますが、どういうわけか、それの使用法を見ると、それのポイントを吸収することはできません。ここでもう少し正確に言うと、私の混乱が始まった場所です。

mov al, [L1]

ここでは、例としてL1は何らかのマクロであり、後でマシンコードの実際のアドレスに置き換えられると思いますよね?

したがって、この指示が行うことは、控訴です al 登録(物理的なアドレスをほとんど変更できないため)と保存されているものに値を変更する L1.

今まではすべてが大丈夫な場合:

mov [L1], al

それは類推を意味するでしょう、アドレスが保存されていたに違いありません(したがって、これを行うことにはいくつかのポイントがありました)。

あなたが私にそれが間違いがない場合に大丈夫だと言えば、それをしてください、それは私が学習を続けることを可能にするでしょう。

最後に、NASMが束を追加します 0xAA55 私のコードの下で(このシーケンスはプログラムを正しく終了するはずですか?)、なぜそれが何度もそこにあるのですか?

役に立ちましたか?

解決

L1 通常/おそらくa ラベル, メモリ内の1つの特定のアドレスに関連付けられています。プログラマーは自分の利便性のためにさまざまなラベルを定義し、そのようなラベルはメモリ内の特定の場所を象徴的に表すために使用されます(L1はお粗末な名前です。ラベルは通常、場所の根本的な目的を示しています。など)。

1バイトの静的ストレージのラベルは、Cコンパイラが実装する方法です char L1; グローバル範囲で。


NASM構文で、 mov edi, L1 に組み立てます mov eax, imm32 の形 mov, 、つまり、ラベルアドレスは、マシンコードで32ビットの即時になります。 (アセンブラーは最終的な数値を知りませんが、リンカーはそうします。)MASMの構文では、これは負荷であり、必要なことに注意してください mov edi, OFFSET L1 即時としてラベルアドレスを取得します。

しかし mov al, [L1] 32ビットのアドレスが控除されるアドレスとしてマシンコードに埋め込まれているため、別の命令に組み立てられます。この命令は、アドレスL1から1バイトをロードし、ALに配置します。

アセンブリ言語では、この間接的なアドレス指定モードは、特定の命令のソースまたは宛先オペランドを四角い括弧によって表されます。 (しかし、両方ではありません:x86は、命令ごとに最大1つの明示的なメモリオペランドのみをサポートします。)

mov al, [L1]

L1に保存されているアドレスを使用して、メモリ内のある場所を見つけ、この場所で1バイト(= 8ビット= ALレジスタのサイズ)を読み取り、ALレジスタにロードします。

  mov [L1], al

これを逆にします。 IEは、具体的には、L1に保存されているアドレスを読み、このアドレスを使用してメモリ内の特定の場所を見つけ、Alレジスタの内容を保存します。


X86ファミリーの新しいプロセッサに関して、不完全でやや時代遅れであることを理解している場合は、 8086アーキテクチャのプライマー おそらく、X86ファミリーのアセンブリ言語で開始するのは非常に便利です。
この「CPUの古代」(実際にはまだ使用されている)から始めることの利点は、基本的な概念がすべて存在し、レジスタの新しいセット、派手なアドレス指定モード、運用モード、その他の概念が妨げられていないことです。新しいCPUの大きなサイズ、機能、モードは、オプションの組み合わせ爆発を導入するだけであり、それらのすべて(ほとんど?)はその方法で役立ちますが、開始とは本質的には無関係です。

他のヒント

あなたの質問に従うのは難しいですが、私は助けようとします。

アセンブリでは、シンボルはアドレスの名前にすぎません。アセンブリソースでは、L1は他の場所で定義されているシンボルであり、アセンブラーはメモリへのオフセットとして解決します。

解放の場合([]表記を使用)、レジスタ(「mov al、[esi]」のように)またはアドレス(「mov al、[l1]」のように)を繰り返すことができます。どちらのステートメントも同じことを行います。唯一の違いは、アドレスの違いです。

ダウンロードすることをお勧めします Intel CPUドキュメント 命令参照をスキミングします。圧倒されたくない場合は、古いX86プロセッサ(たとえば、486以上)から読み始めてください。そのドキュメントはまったく友好的ではありませんが、手元にあることは非常に便利です。

私はNASMの詳細を知りません、私は15年前にターボアセンブラーでアセンブリを学びました、そしてその知識は今日でも役に立ちます:)

また、「x86アセンブリチュートリアル」のグーグルを試してみることをお勧めします。あなたに役立つ可能性のある関連するドキュメントがたくさんあります。

ああ、最後に、NASMは私のコードの下に0xaa55の束を追加します(このシーケンスはプログラムを正しく終了するはずですか?)、なぜそれが何度もそこにあるのですか?ここで読んでくれてありがとう。

ブートローダーを作成した場合にのみ適用できるのは確かです。 「ブート署名」です。このコードをフロッピーに書き込むとします(生成されたマシンコードも正確に512バイトですか?)、このブートローダーコードでコンピューターを起動したい場合、BIOSはフロッピーを調べ、実際のブートローダーかどうかを判断します。それを行うために、フロッピーの最初のセクターの最後の2バイトを見ます。 0xAA55 ブート可能であることを示すために..(これは、ハードドライブやサムドライブなどから起動する場合と同じように機能します。4096バイトセクターがあるため、CDの場合はわずかに異なります)

ソースコードでは、最後の行のようなものです $(times.. db 0xAA55 またはそのようなもの?ブートローダーを作成するつもりがない場合は、そのラインを効果的に削除できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top