問題タブ [instruction-set]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
assembly - Tilera と SSE での算術命令の「欠落」。操作はどのように行われますか?
Tilera Instruction Setを参照したところ、加算、減算、乗算、除算、およびシフトしか含まれていないことに気付きました。根、力、丸太などについての言及はありません。
また、SSE (すべてのフレーバー) には後者の指示がないことにも気付きました。
Tilera も SSE も、ビデオ エンコーディングなどの数学ベースの処理用に設計されているため、これは興味深いことです。
そのような場合、これらの操作のいずれかをどのように実行しますか (Tilera & SSE [通常のスカラー操作を除く])?
c++ - TriCore エミュレーターにオペランドをロードするタイミングは?
これはスタック オーバーフローに関する私の最初の投稿なので、正しく行っていることを願っています。;-)
TriCore エミュレーターを開発しようとしていますが、命令のオペランドをロードするタイミングを決定できません。TriCore はあまり知られていない種類のマイクロコントローラーかもしれないので、そのアーキテクチャーについて少し説明させてください。
命令には 16 ビットと 32 ビットの 2 種類があります。16 ビットか 32 ビットかは、最後のバイトのビット 0 によって決まります。バイト順はリトル エンディアンであるため、常にメモリの最初のバイトになります。問題ありません。
これらの 2 つの命令タイプには、16 ビット命令用の 14 と 32 ビット命令用の 25 という、いくつかのオペコード形式があります。オペコードは 2 つの別個のオペコード フィールドに分割されますが、16 ビットのもののほとんどにはオペコード フィールドが 1 つしかありません。最初のオペコード フィールドは下位 8 ビットにあります。16ビット命令の命令を直接記述し、32ビット命令の多くでは、オペランドのエンコードを記述しますが、2番目のフィールドは実際の命令を記述します(ただし、もちろん例外があります)。
私の計画は、常にすべてのオペコード フィールドを抽出し (2 番目のフィールドの位置がすべての命令フォーマットで同じではないため、少し面倒です)、関数ポインター テーブルで使用される 16 ビット値にまとめることです。 .
この値に応じて、オペランドを抽出したいと思います。たとえば、32 ビット命令で最初のオペコードが0x8B
の場合、オペランドは 2 つのデータ レジスタと 1 つの 9 ビット定数です。しかし、本当に退屈な例外があります:
ADD.A
and命令のADDSC.A
両方にオペコード 1 == があり0x01
ます。ただしADD.A
、3 つのアドレス レジスタを使用するのに対しADDSC.A
、命令にエンコードされた 2 つのアドレス レジスタ (1 つのデータ レジスタと 1 つのインデックス) を使用します。
最後に私の質問は次のとおりです。命令を実行する前に、このようなアーキテクチャにオペランドをロードすることはまったく可能ですか? それとも、最初に命令関数を呼び出して、そこでオペランドを抽出する方がよいでしょうか?
興味のある方は、命令セットのマニュアルをご覧ください。
ヒントをありがとう!
ところで: 選択する言語は C または C++ です。
(リクエストにより、元の質問に私の考えを挿入しました。)
さて、私は自分が持っているさまざまなオプションについて広範囲に考えましたが、次のことで解決すると思います.
プロセス全体を 2 つの部分に分けます。
- プログラム解析とオペランド抽出
- 実行
最初のステップでは、各命令がロードされ、32 ビットに整列されます。次に、ロードされた命令が一連のビット マスクと比較され、最終的に何を実行する必要があるかだけでなく、オペランドがどのようにロードされるかを示す適切なオペコードが決定されます。アドレス モード固有の関数では、オペランドはポインターにロードされます。命令即値は必要に応じて格納されます。
これは、次のような構造体に要約されます。
これは基本的に各命令に割り当てられます (最大の欠点: メモリ消費量。最悪の場合 (64 ビット ポインター) のような構造体に対して約 40 バイトを計算しました。つまり、通常は 4 メガバイトで、16 ビット命令のみで構成されるプログラムは、最終的に約 80 メガバイトのメモリを占有しますが、実行速度はかなり速くなると思います)。
このアプローチでは、オペランドがどのように読み込まれるかは問題ではないため、各命令を 1 回だけ実装できます。また、同じ命令を同じオペランド セットで実行すると、実際のマシンと同じように動作します。コードの実行は、正しい構造体を選択し、それに応じて命令関数を呼び出すことによって、正しいオペランドのセットをロードすることを意味するだけです。
私は他のアプローチがあることを知っています - 私は特に動的再コンパイルが好きです。しかし、このシステムはさまざまなオンチップ コンポーネントと I/O マップされたレジスタでかなり複雑であり、いずれにせよかなりの量のボイラープレート コードが追加されます。
私のアプローチについてコメントをいただければ幸いです。多分あなたはそれを行うより良い方法を知っていますか?
ありがとうございました!
arm - ARMサム命令セットとは何ですか?
「ARM11TechnicalRefManual」のセクション1-34の「Thumb命令セット」の下に、次のように書かれています。
「Thumb命令セットは、最も一般的に使用される32ビットARM命令のサブセットです。Thumb命令は16ビット長であり、プロセッサモデルに同じ影響を与える対応する32ビットARM命令があります。」
誰かがこの特に2番目の文についてもっと説明し、プロセッサがそれをどのように実行するかを言うことができますか?
architecture - キャリーフラグは廃止されていますか?
キャリーフラグには2つの主な用途があるようです。1)足し算/引き算の命令を連鎖させて、ネイティブサイズよりも大きい数を操作すると便利です。たとえば、8ビットアーキテクチャに32ビットintを追加します。2)条件付きブランチに使用されます。あまり一般的ではない使用法もいくつかあります(たとえば、Intelでfcomiを使用しました)。特に、キャリーフラグは、Cまたはその他の一般的な非アセンブラ言語で定義またはアクセスできません。32ビットおよび64ビットアーキテクチャは非常に一般的であり、CIで記述されたほとんどのソフトウェアは次のことを不思議に思う必要があります。
キャリーフラグは廃止されていますか?それなしで新しいアーキテクチャが登場した場合、誰がそれを見逃すでしょうか?
条件コード(フラグが述語に置き換えられるなど)としては必要ないと想定しているため、AFAICTは、add / sub / rotのチェーンにのみ使用され、シフトイン/シフトアウトの効果はなくなります。
operating-system - OSはサウンドカード/ビデオカードなどの周辺機器とどのようにやり取りしますか?
私が理解している限り、すべてのプログラムは、実行されているアーキテクチャの一連のアセンブリ命令にコンパイルされます。私が理解できないのは、オペレーティング システムがビデオ カードなどの周辺機器とどのように相互作用するかということです。ドライバ自体がCPUの一連の組み立て説明書じゃないの?
私が考えることができる唯一のことは、周辺機器によって監視されるメモリ領域を使用するか、バスを使用して操作を通信し、結果を受け取ることです。このプロセスの簡単な説明はありますか。
この質問が一般的すぎる場合は申し訳ありませんが、それは私を悩ませてきたものです。
assembly - 文書化されていないプロセッサの命令セットを見つける方法はありますか?
プロセッサの中には、その命令セットが何であるかを説明するドキュメントが市販されていないものがあります。プロセッサにアクセスできる場合、改ざんまたは外部デバイスを介して命令セットを見つける方法はありますか?
hardware - 最低限必要な組み立て説明書は何ですか?
任意のプログラムを実行するために使用されるプロセッサを構築する場合、最小の命令セット (ISA) は何ですか?
私が考えていた:
ALU-ops (add、sub、mul、div)
ロードレジスタ、[アドレス]
店舗登録、[アドレス]
分岐 if 操作。等しくない場合、>、< の場合 (branchif reg1, reg2, LABEL)
どう思いますか?
cpu-architecture - CISC命令の長さ
今日のほとんどのCISCアーキテクチャでのCISC命令の可能な最大長はどれくらいですか?
決定的な答えはまだ見つかりませんが、理論的には16バイトの長さであることが示唆されています。
15時頃のビデオで、なぜスピーカーは「理論上」を提案するのですか、そしてなぜ正確に16バイトなのですか?
jvm - スタックベースのマシンの命令セットを考案するには?
CLR や JVM などのスタック ベースの仮想マシンには、さまざまな命令セットがあります。仮想マシンを作成する際に命令セットを考案する背後にある理論はありますか? たとえば、0 ~ 5 の定数をスタックにロードするための JVM 命令セットがあります。
一方、CLRには、次のように0から8までの番号をスタックにロードする命令セットがあります
なぜ上記のオペコードが必要なのですかldc.i4.9
?ldc.i4 <int32 (num)>
そして、このようなものは他にもあります。
異なる VM のオペコード間のこの違いの背後にある理由は何ですか? これらのオペコードを考案するための特定の理論はありますか、それとも VM 自体の特性によって完全に駆動されるのか、高水準言語構造に依存するのでしょうか?
c - ARM 命令のデコード
C で ARM(ARM926EJ) 命令をデコードする必要があります。16 進数の 32 ビット命令があります。オペコードオペランドをデコードして取得したい。誰でもこれに適した資料を知っています。
NB QEMU translate.c ファイルを調べました。しかし、それは非常に複雑で、なぜ何をしているのかさえわかりません。