アセンブリの「下」にプログラミング言語はありますか?
17 に答える
実際には、マシン コードの下にMicrocodeと呼ばれるレベルのコードがあります。
マシンコード。バイナリの 1 と 0 でコード化されたプログラマーの時間。16 進数はこれよりも優れていると考えられていました。それは、コードの名前を使用し、命令のパーツをパーツに分割するアセンブリの前でした。
アセンブリは、マシン コードのテキスト表現です。CPU自体内の単一の命令を表す単一のステートメントがあります。たとえば、「MOV X, Y」は、CPU を通過して値 X を位置 Y に移動する単一の命令です。機械語コードに到達するために、CPU は「MOV」を表す番号と、 'X' (まだ数値でない場合)、および Y を表す数値。これらの生の HEX バイナリ値はマシン コードです。CPUがトランジスタに電圧/電流を流して、CPUの機能を実行させるのは、この数値です。
マシンコードは下位レベルですが、アセンブリに非常に近いものです。それは非常に近いので、命令「MOV」=移動を読み取ることができるという利点のために、誰もそれを使用することを気にしません。スタックまたはヒープ内の生のアドレスではなく、変数名も読み取り可能になります。
さらに下に行くと (「言語」という言葉は「マシン」言語やさらに下位の物理層に適しているわけではありません)、マシン言語の下には、各バイナリオペコードを実際に実装するために使用される多くのゲートとスイッチの構成があります。関係する特定のハードウェア (CPU) ... このさらに低いレベルをカバーする優れた本は、Charles Petzold 著の「CODE」です。
以下で、より低いレベルを意味する場合は、はい。機械語があります。アセンブリは、実行前に機械語に変換されます。多くの最新のプロセスでは、機械語はマイクロコードでエミュレートされています。マイクロコードの詳細については、こちらを参照してください。
アセンブラは、アセンブラによってマシンコードに変換されます。バイナリエディタで書くことができます。(痛い!)CISCコンピュータは、チップのセグメント(ALU、メモリフェッチなど)をシーケンスするマイクロコードを持つことができます。通常、チップメーカーを除いて、誰もマイクロコードを書きません。
なぜあなたが尋ねているかによります。アセンブリでできないことで、他の方法でできることはありません。マシンコードは、まったく同じデータの別の表現にすぎません。
非常に最初のコンピューター (ENIAC) はハード ワイヤリングを使用していたため、ある計算からの出力を別の計算に入力として供給することができました。別のプログラムを実行するには、いくつかのケーブルを取り外して、別の方法で再配線する必要がありました。
CPU に電流を送り、ピクセルを配置する場所を伝えることができます。(ほとんどバイナリですが、コンピュータを使用して記述しません。)
アセンブリ言語は、従うべき文法規則を含まないため、機械語は言語ではないため、プログラミング言語構築の下層階です。マシンコードは、マイクロプロセッサ操作を実行する唯一のデータ形式である場合があります。CPU はメモリからデータをフェッチし、フェッチされたマシンコードに従って命令を直接実行します。
ただし、Intel Pentium 4 以降などの一部の最近の設計では、マシン コードは、uops または microoperations として知られる下位レベルの RISC 実行ユニット操作の表現です。したがって、これらの設計のデコード ロジックは、CISC タイプの命令を小さな uop に変換することです。これらの命令は、通常、RISC のような単純なロード/ストア ユニットを対象としています。この側面では、(技術的に正確ではないかもしれませんが) 機械語は、CPU の基礎となる実行ロジックによってアトミックに実行される「実際の」操作ではなく、アーキテクチャの「高レベル」の複雑な命令を記述すると言えます。 .
つまり、アーキテクチャ命令セット、つまりアーキテクチャ マシン コードと、外界から隠されている内部レベルの「マイクロ命令」セットがあります。Intel プロセッサのトレース キャッシュは、プロセッサのスーパースカラー パフォーマンスを最適化するために、そのような op を格納するように考えられていました (CPU は、プログラムで実行できるアーキテクチャ命令セットではなく uop を実行するため)。
コードはいつでも 2 進数 (または 16 進数、またはその他の表現) で記述できます。次に、頭の中でジャンプオフセットなどを計算する必要があります。推奨されません。;)
並べ替え。機械はアセンブリを読むのではなく、アセンブリが変換されたものである「機械語」を読みます。機械語には、アセンブリのニーモニックの代わりに「オペコード」があり、これらのオペコードは通常、単なるバイナリ データです。通常、マシン コードは人間が判読できるとは見なされません。
RISC システムでは、マシン コードはアセンブリの単純な変換であることがよくありますが、特に x86 システムでは、この 2 つはまったく異なります。
確かに: 「マシン コード」については、ウィキペディアのアセンブリ言語に関する記事 ( http://en.wikipedia.org/wiki/Assembly_language ) で次のように述べられています。特定の CPU アーキテクチャをプログラムするためです。」
マシンコードの下でさえ、VHDL - チップ設計と言えます。コードを実行するためにチップを設計する必要さえなく、入力を出力に即座に変換するだけです。
(私は専門家ではありません - 私は C++ を使用しています)