問題タブ [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.
encoding - 相対JMP(x86)はアセンブラーにどのように実装されていますか?
JMP
x86プラットフォーム用のアセンブラを構築しているときに、命令のエンコードでいくつかの問題が発生しました。
(私のお気に入りのx86命令Webサイト、http://siyobik.info/index.php?module = x86&id = 147から)
すべて相対ジャンプであり、各エンコーディング(演算+オペランド)のサイズは3番目の列にあります。
現在、私の元の(したがってこのために障害がある)設計では、各命令に最大(5バイト)のスペースが予約されています。オペランドはまだ不明な場所へのジャンプであるため、まだ不明です。NOP
そこで、ジャンプの場所がわかっている場合は、メモリ内の正しい場所にオペランドを再書き込みし、残りをsで埋める、「再書き込み」メカニズムを実装しました。これは、タイトループではやや深刻な問題です。
今私の問題は次の状況にあります:
JMP
問題は、命令 に対して可能な限り最小のエンコーディングが必要なことです(そしてNOP
塗りつぶしは必要ありません)。
のオペランド間のc
相対距離を計算する前に、の命令のサイズを知る必要があります。同じことがatにも当てはまります。との間の相対距離を計算する前に、のサイズを知る必要があります。a
b
d
JMP
c
d
e
a
既存のアセンブラはこの問題をどのように解決しますか、またはこれをどのように行いますか?
これは私が問題を解決すると考えていることです:
最初に、とそのターゲットの間のオペコードへのすべての命令をエンコードします。
JMP
この領域に可変サイズのオペコードが含まれている場合は、最大サイズを使用します(例5
:JMP
。次に、JMP
可能な限り最小のエンコードサイズ(3、4、または5)を選択して、ターゲットを基準にしてエンコードし、距離を計算します。可変サイズのオペコードがエンコードされている場合は、前にすべての絶対オペランドを変更し、このエンコードされた命令をスキップするすべての相対命令を変更します。オペランドが変更されると、可能な限り最小のサイズを選択するように再エンコードされます。可変サイズのオペコードは(最大サイズを使用するため)縮小する可能性があるため、このメソッドは確実に終了します。
おそらくこれは過剰に設計されたソリューションなのだろうか、それが私がこの質問をする理由です。
assembly - x86 別名 IA32 命令セット アーキテクチャ マニュアルのすべてのバージョンの入手先
Intel 64 および IA-32 Architectures Software Developer's Manualsについて知っています。また、これらがすべてのレガシーおよび古いプロセッサ ISA をカバーしていることも知っています。
しかし、各プロセッサの個別のマニュアル (プロセッサと一緒にリリースされたもの) が必要です。
編集:
バウンティはじめます。
assembly - アセンブラ mov の問題
私は次のコードを持っています:
なんでこんな風に書けないの?
すべてのソース:
ありがとうございました!
assembly - ia-32アセンブリで3オペランドのimul命令は正確に何をしますか?
指示を読んでいます
そして私はそれが正確に何をしているのか困惑しています。imulが乗算されることは理解していますが、構文がわかりません。
language-agnostic - 数値のハードウェア表現に頭を悩ませる: 仮説的な 2 の補数の質問
これは非常に素朴な質問です (私は知っています) が、CPU の基本的な命令セットが実際にどのように実行されるかを検討するための良い出発点になると思います。
2 の補数システムでは、実装で表現できる最大の負数の符号を反転することはできません。これの理論的な理由は、最も負の数の否定が実装の範囲外になるという点で明らかです (範囲は常に
-128 から 127 のようなものです)。
ただし、最も負の数に対して否定演算を実行しようとすると、実際に何が起こるかはかなり奇妙です。たとえば、8 ビット表現では、最も負の数は -128、つまり 2 進数で 1000 0000 です。通常、数値を否定するには、すべてのビットを反転してから 1 を追加します。ただし、これを -128 で実行しようとすると、次のようになります。
あなたが始めたのと同じ番号。このため、ウィキペディアはそれを「奇妙な数」と呼んでいます。
同じウィキペディアの記事では、上記の否定は
最上位ビットへのキャリーがあったが、最上位ビットからのキャリーがなかったため、オーバーフロー状態として検出されました。
だから私の質問はこれです:
A) 一体どういう意味ですか? B) CPU は、
この否定に関連するアクシデントを回避するために、基本的な算術演算を実行するたびに追加のエラー チェック ステップを実行する必要があり、大きなオーバーヘッドが発生するようです。その場合、表現できる数値の範囲を切り捨てて、奇妙な数値を除外しないのはなぜですか (つまり、8 ビットの場合、-127 から 127 まで)。そうでない場合、余分なオーバーヘッドを発生させずにそのようなエラー チェックを実装するにはどうすればよいでしょうか?
assembly - 簡単なMIPS、質問
ちょっとややこしい質問があります
答えは、後ろにsltと関係があります。質問が正確に何を求めているのか、そして答えは何なのか、誰か説明できますか?
ありがとう
c - Cプログラマーの観点から見たARMアーキテクチャの違いは?
私はARMのプログラミングにかなり慣れていません。ARMv4、ARMv5、ARMv6などのアーキテクチャがいくつかあることに気づきました。これらの違いは何ですか?それらは異なる命令セットまたは動作を持っていますか?
最も重要なことは、ARMv6用にCコードをコンパイルした場合、ARMv5で実行できるのでしょうか。ARMv6で実行されているARMv5コードはどうですか?それとも、カーネルアセンブリコードを書いている場合にのみ、違いを心配する必要がありますか?
operating-system - オペレーティング システムの 1 秒あたりの命令数
私はコンピューター アーキテクチャとデザインの初心者です。私の質問は高レベルのプログラムでした。命令セットは CPU で次々と実行されます。これらの命令を実行するときに、オペレーティング システムの命令がオーバーヘッドとして含まれますか? 例: 2 GHz プロセッサの場合、2*10^9 クロック サイクルで実行できる 2*10^9 命令があります。その場合、オペレーティング システムは常に 1 秒あたり約 1*10^9 命令を実行します。このオーバーヘッドは常に存在し、別の 1*10^9 命令のみが、他のカスタム スケジュール プログラムの実行に自由に使用できますか?
これは、オペレーティング システムが常に実行する命令をできる限り少なくして、実行する他のプログラムをより多く収容できるようにする必要があるということですか?
x86 - Intel が条件付き移動命令を追加した最初の CPU はどれですか?
私はそれについてどこかで読んだことを覚えています... 誰かこれに光を当てることができますか?
cpu - CPU は自分の命令セットをどのように認識していますか?
パソコンの基本操作の質問ですが、どうやって聞けばいいのかわかりません。コンピューターに命令セットがあると言うとき、コンピューターはどのようにしてそのセットが何であるかを知るのでしょうか? ROMチップに保存されていますか?CPUのどこかに保存されていますか?ディスクを読み取ってマシンコードの処理を開始できるように、メーカーはそれをどこに配置しましたか?