2025/06/04 05:19 Machine Code Isn't Scary

ロボ子、今日のニュースは機械語じゃ!JSONスキーマに準拠するようにJSONを作成できる人なら誰でも書けるらしいぞ。

JSONに準拠していれば書けるんですか?なんだか意外です。機械語って難しそうなイメージがありました。

そうなんじゃ。基本概念は命令、レジスタ、メモリの3つだけ!

命令、レジスタ、メモリ…なるほど。それぞれ詳しく教えてください。

命令は実行されるコードのことじゃ。AArch64だと32ビットの数値で、演算内容とデータの引数を含むぞ。レジスタは値を格納する場所で、AArch64にはX0からX30までの31個の汎用64ビットレジスタがあるんじゃ。

レジスタが31個もあるんですね!それぞれ役割があるんですか?

そうじゃ、レジスタは慣例的に異なる目的に使われるんじゃ。それを呼び出し規約と呼ぶぞ。

呼び出し規約、了解です。メモリはどうですか?

メモリはリストみたいなもので、値を格納したり、アドレスを指定してアクセスできるんじゃ。`STR`命令を使うと、メモリに値を格納できるぞ。

`STR`命令は配列への書き込みのようなもの、という事ですね。

その通り!そして、プロセッサによって命令セットが違うんじゃ。現代のPCはx86-64、新しいMacやRaspberry Pi、モバイルデバイスはARMを使うことが多いぞ。

x86-64とARMで機械語が違うんですね。x86-64についても教えてください。

x86-64も命令、レジスタ、メモリを使うのは同じじゃが、エンコーディングが違うんじゃ。レジスタ名はrax, rbx, rcx, rdxなどがあるぞ。

エンコーディングが違うんですね。x86-64は固定幅の命令セットではない、と。

そう!x86-64の命令は複数の部品から組み立てられるんじゃ。例えば、REX, ModR/M, OpCodeなどがあるぞ。

部品を組み合わせて命令を作るんですね。なんだかプラモデルみたいで面白いです。

まさにそうじゃ!`REX.W + C7 /0 id`は、32ビットの符号付き即値を64ビットレジスタに移動する命令じゃ。

なるほど。機械語を学ぶことで、低レベルの詳細を理解できるようになるんですね。

そうなんじゃ!オーバーフローとか、スタック、ジャンプとか、まだまだ学ぶことはたくさんあるぞを使うと、コンパイルされたコードを確認できるから便利じゃ。

compiler explorer、使ってみます!低レベルの事柄は難しくはないけど、文書化や説明が不十分なことが多い、というのも納得です。

じゃろ?機械語をマスターすれば、ロボ子も最強のAIになれるぞ!

頑張ります!ところで博士、機械語で書かれたプログラムがバグったら、デバッグも機械語でするんですか?

うっ…それは…気合でなんとかするのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。