問題タブ [i386]
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.
macos - プログラムはどのようにしてi386とppcを同時にサポートしますか?
/binにあるプログラムでi386およびppcアーキテクチャをサポートする方法を知りたいです。
私は例えば走ります
私は得る
プログラムはソースコードでi386とppcをどのようにサポートしていますか?
つまり、ppc -architectureのサポートを削除した場合、たとえば/ bin /amberでどのコンポーネントを削除できますか?
assembly - 「pushl 2000」を AT&T asm から i386 の Intel 構文に変換する方法
以下を AT&T アセンブリから Intel アセンブリに変換しようとしています。
これは次のようにコンパイルされます。
しかし、私が何をしようとしても、Intel Synax で同じ結果を得ることができません。私は試しました:
だから私は手がかりがありません.「プッシュ2000」に相当するものは何ですか?
graph-theory - レジスター割り当てとスピル、簡単な方法は?
ローカル変数をレジスタに割り当てる方法を探しています。それを行うためのいくつかの深刻な方法(つまり、ウィキペディアで言及されているもの)を知っていますが、「こぼれ」がどのように達成されるかについては固執しています。また、関連する文献は非常に威圧的です。私の優先事項を満たすもっと簡単なものがあることを願っています:
- 正しさ -- ローカル変数の数に関係なく、正しいコードを生成するアルゴリズム。
- シンプルさ -- あまり文献を読まなくても理解できるもの。
- 効率 -- 次のような現在の方法よりも優れている必要があります。
x = y # z
操作を次のように変換します。
Intel 386 をターゲットにしているため、関連する制約は次のとおりです。
- 二項演算は 2 つの引数を取り、そのうちの 1 つはソースと宛先です。単項演算は単一の引数を取ります。
- 操作は 1 つのメモリ ロケーションにのみアクセスできます。したがって、二項演算には、レジスタに少なくとも 1 つの引数が必要です。
- 使用できるレジスタは最大 6 つです
%eax
%ebx
%ecx
%edx
%esi
%edi
。(%ebp
最後の手段として含めることもできます。) - 整数除算や戻りレジスタなどの特殊なケースもありますが、今のところ無視できます。
現時点で、コンパイラーが通過する 3 つのステップがあります。
- i386ification: すべての演算はフォーム
a = a # b
(またはa = #a
単項演算) に変換されます。 - ライブネス分析: 各操作の前後のライブ変数のセットが決定されます。
- 登録割り当て: 干渉グラフが作成され、色付けされます。
そして、コンパイラはクレヨンを空中に投げ、次に何をすべきかわかりません。
例
これは、関数のかなりきれいな干渉グラフと、活性情報を含む CFG です。残念ながら、CFG 画像には垂直方向のスクロールが必要です。
7色使用しました。それらの1つ(またはその色が割り当てられた変数のセット)をこぼしたいと思います。あまり重要ではない選択方法。こぼれた変数をどのように処理するかは、注意が必要です。
t
変数のセット$t4
である「ピンク」をこぼしたとしましょう$t7
。これは、これらの変数の 1 つを参照する操作は、レジスターではなく、スタック フレーム上のその位置からアクセスすることを意味します。これは、この例では機能するはずです。
しかし、プログラムが次の場合はどうでしょう。
両方a
とb
もこぼれなければなりませんでしたか?addl b, a
2 つのメモリ アドレスを持つ命令を発行できません。オペランドの 1 つを一時的に保持する別のスペア レジスタが必要です。これは、別の色をこぼすことを意味します。これは、次の一般的な方法を示唆しています。
- すべての変数に色を付けることができれば
r
、すばらしいことです。 - それ以外の場合は、いくつかの色とそれに関連する変数をスピルします。
- スピルされた 2 つの変数にアクセスする操作が存在する場合は、別の色をスピルし、そのようなすべての操作の一時記憶域としてスペア レジスタを使用します。
この時点で、必要以上に多くのものがこぼれているのではないかと思います。変数自体ではなく、変数の有効期間の一部をこぼすなど、何か賢い方法でこぼす方法はないかと考えています。ここで使用できる簡単な(っぽい)テクニックはありますか?繰り返しますが、私は特に高いところを目指しているわけではありません。確かに、何かを深く読む必要があるほど高くはありません。;-)
特定の問題
具体的な主な問題は、変数がスピルされた場合、生成される命令にどのような影響があるかということです。その変数を使用するすべての命令は、(スタック位置から) メモリ内で直接アクセスする必要がありますか? 操作が 2 つのスピルされた変数を使用する場合、これはどのように機能しますか? (アーキテクチャでは、命令が 2 つの異なるメモリ位置にアクセスすることはできません。)
二次的な問題は次のとおりです。
- 正確さ (そしてそれほど重要ではありませんが効率) のために、ロード/ストア命令を挿入する場所を決定するにはどうすればよいですか?
- 変数がすぐに使用されない場合に、その有効期間のその部分だけをスピルし、後でアンスピルすることはできますか? すべての命令がスピルされていないレジスタで動作するようにします。変数は、異なる時点で異なるレジスターに存在する可能性があります。
- 特殊なケースでもう少し効率的にできますか。例えば
%eax
戻り値には が使われているので、たまたま戻り値が出るまでにそのレジスタに戻り値の変数が割り当てられていればいいのですが。同様に、一部のレジスタは「callee-save」であるため、関数呼び出し時にアクティブな変数が少ない場合、それらを呼び出し先保存以外のレジスタに割り当てると、それらのレジスタの格納を回避できます。 - SSAフォームは(もしあれば)大いに役立ちますか?一般的な部分式を削除して定数を評価できるようになれば、レジスタの負担が軽減 (?) される可能性がありますが、それ以外の場合は効果がありますか?
私が(今のところ)気にしていない側面は次のとおりです。
- スタックの割り当てと最適化: すでに単純に実装されており、必要に応じて干渉グラフを使用して最適化できます。
- 終了する限り、コンパイル時の効率。(NP 完全性は、特定のアルゴリズムを避ける必要があることを意味するものではありません。)
アップデート
ダウンタイムについて申し訳ありません-私は与えられた答えについて考えていて、いくつかのアイデアの実装を開始するための簡単なアプローチを見つけようとしています. 正直、先延ばしにしていました... :-\
とても素敵なプレゼンテーションを見つけました (PPT、悲しいことに):
http://www.cs.princeton.edu/courses/archive/spr05/cos320/notes/Register%20Allocation.ppt
これは、特定の操作のニーズに対処する方法に関する質問に答えます (ソースと宛先に同じレジスタを使用する、または一部の操作に特定のレジスタを必要とするなど)。私が確信していないのは、Liveness-Coloring-Allocation サイクルが終了するかどうかです。
すぐに実際の作業を行い、うまくいけば質問を閉じます。
x86 - i386 は x86 とは違うのですか?
Fedora Linuxをダウンロードする際、x86 と i386 の違いがわからないダウンロード用の 2 つのオプションが提供されます。では、それらの違いは何ですか?
c - Autoconf はコンパイラ フラグを無視します
非ネイティブ アーキテクチャで C ライブラリを構築しようとしています。OSX 10.6 (x86_64) を実行していますが、i386 用にコンパイルされたライブラリが必要です。通常、コンパイラ フラグ -arch i386 を追加するだけです。しかし、私は Autoconf を使用しており、構成ファイルでこれを無視し、実行しようとしても無視します: ./configure CC="gcc -arch i386".
otool を使用してヘッダーを調べたので、x86_64 オブジェクト ファイルがビルドされていることがわかります。本当のキッカーは、autoconf が構成の概要を書き出すときに、cc フラグに -arch i386 をリストすることです。何が起きてる??
仕様:
OS X 10.6.2
gcc 4.2.1
autoconf 2.64
3.81にする
c - i386でのトレースバックの実装
現在、コードをアルファ版(Tru64)からCのi386プロセッサ(Linux)に移植しています。例外処理ルーチンの移植を検討するまで、すべてが順調に進んでいます。現在、多くのサブプロセスを生成する親プロセスがあり、これらのサブプロセスの1つが致命的な(フィールド化されていない)場合、プロセスをキャッチするルーチンがあります。
私は現在、エラーログに関数アドレスをリストできるトレースバックルーチンを実装するための最良の方法を見つけるのに苦労しています。現在、私のルーチンは、例外の原因となった信号と例外修飾子コードを出力するだけです。
どんな助けでも大いに受け取られるでしょう、理想的には私はすべてのプロセッサのためにエラー処理を書くでしょう、しかしこの段階で私は本当にi386とx86_64だけを気にします。
ありがとう
マーク
objective-c - アプリはi386でクラッシュし、x86_64で動作します
今日、Xcodeプロジェクトでアーキテクチャを切り替えてみました。これは、64ビットにまだ移植されていない低レベルのQuickTimeのものを使用しようとしていたためです。以前にx86_64でコンパイルしたとき、私のアプリは問題なく動作しました。次に、アーチをi386とブームに切り替えましたが、起動時にアプリがクラッシュし続けます。
奇妙なことに、スタックトラックは私自身のコードとは何の関係もありません。
何か案は?
python - 32ビットのコンパイル済みバイナリを実行しているプロセスは4GBを超えるメモリを使用できますか?
Snow Leopard(64ビットマシン)で32ビットのコンパイル済みバージョンのPythonを実行している単一のプロセスが、topコマンドで見られるように4GB(たとえば5.4GB)を超える仮想メモリを消費しているように見える可能性はありますか?
file ...python
バイナリがx86ではないことを確認しましたが、5GBを超えるメモリを消費しているように見えました。
私の推測では、使用されたライブラリ(RPy)はデータのチャンクを「mmap」しており、メモリ内キャッシュは私のプロセスのメモリフットプリントの下に表示されていました。
または、Pythonバイナリが32ビットであることを確認していない可能性があります。あるいは、32ビット/ 64ビットの混合が行われているかもしれません(libffi?)。
完全に混乱しています。
linux-kernel - 386セグメントセレクターのベースアドレスの幅を拡張して、32ビットOSの4GB RAM制限を超えますか?
メモリ要件が急速に増大するにつれて、今日、ますます多くのシステムがさらに大きなRAMにアクセスするために64ビットマシンを必要としています。
386プロテクトモードのFWIKでは、メモリポインタは2つの部分で構成されます。セグメントセレクタによって指定されたベースアドレス(32ビット)と、ベースアドレスに追加されたオフセットアドレス(32ビット)です。
すべてのプログラムを64ビットで再コンパイルするには、多くの作業が必要です。たとえば、C / C ++プログラムの場合、マシンに依存する `int'タイプ(32ビットマシンでは32ビット、64ビット)です。 64ビットマシンの場合)正しく使用しないと問題が発生します。問題なく再構築されている場合でも、メモリ要件が継続的に増大するにつれて、たとえば、いつか128ビットマシンを使用するようになり、新しいワードサイズに準拠するためにすべてのプログラムを再構築する必要がありますか?
ベースアドレスを64ビットに拡張してRAM全体に4GBウィンドウのようなセグメントを作成すれば、64ビットOSもまったく必要ありませんね。ほとんどのアプリケーション/プロセスはサーバー側で4G+メモリにアクセスする必要はありません。たとえば、ファイルサーバーがキャッシュ目的で20GB RAMを使用する場合、アクセスごとに2GBの10プロセスに分割される可能性があるため、32ビットポインタは足りる。そして、20GBのメモリをカバーするためにそれぞれを異なるセグメントに配置します。
セグメント制限の拡張は上位層プログラムに対して透過的です。Linuxが異なる64ビットセグメントにメモリを割り当てることをサポートできる場合は、CPUとOSについてのみ実行する必要があります(現在、セグメントのベースアドレスは32ビットですが)それでも)、32ビットマシンで1TBのRAMを簡単に利用できますね。
私は正しいですか?
macos - qtcreator に非ユニバーサル バイナリを強制的に作成させるにはどうすればよいですか
Mac で qtcreator を使用すると、ユニバーサル バイナリが作成されます。
「ネイティブ」バイナリを作成するだけの設定方法を知っている人はいますか? (つまり、私の場合は i386' ですか?)
Qtcreator はビルドシステムとして qmake を使用します。
これまでのところ、Google は私の友人ではありませんでした。
編集:これまでの私の設定ファイル:
それでも libmongoclient.a でエラーが発生します
libboost ライブラリはすべて問題ありませんが、これは +universal オプションを使用して macports から取得したためです。
mongoclient はユニバーサルをサポートしていないため、現在、ユニバーサルのものをすべて削除しています。ブーストライブラリで3つのエラーが発生し、少なくともmongoclientがリンクすることを望んでいました。その時点で、macport のストーリー全体をもう一度やり直すことができましたが、今回はユニバーサルを削除しました。
残念ながら、まだ同じリンカ エラーがあるため、まだユニバーサル バイナリがビルドされているようです。
助けてくれてありがとう