問題タブ [opcodes]
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.
php - 参照による割り当てのバグ
先日、この一見非常に単純な質問に出くわしました $array1 を参照せずに $array2 の値を変更するにはどうすればよいですか? しかし、調べれば調べるほど、これが実際に意図したとおりに機能しているように見えたのは奇妙に思えました。この後、次の出力から生成されるオペコードを調べ始めました。
array2 は array1 のコピーのみであるべきであり、1 つの配列に発生したことは他の配列の内容に影響を与えるべきではないため、これは私にはおかしいようです。もちろん、2行目をコメントアウトすると、最終行は予想どおり 10 をエコーアウトします。
さらに調べてみると、Vulcan Logic Dumper を使用して PHP が生成するオペコードを示すクールなサイトがありました。上記のコードによって生成されたオペコードを次に示します。
これらのオペコードは、 http://php.net/manual/en/internals2.opcodes.phpにはあまり文書化されていませんが、英語ではオペコードが次のことを行っていると思います。一言で言えば…誰よりも私に向いているかもしれません。
- 行 3: 配列を最初の値で初期化し、$array1 に割り当てる前に 10 を追加します。
- 行 4: 書き込み専用を取得しますか? 値を配列から取得し、参照によって $x に割り当てます。
- 5 行目: $array1 を $array2 に設定します。
- 行 6: 1 の配列インデックスを取得します。$6 が返されることはありませんが、od_data はそれを 22 に設定していると推測しています。OD_DATA にはドキュメントがまったくなく、私が見たどこにもオペコードとしてリストされていません。
- 8 行目: $array1 のインデックス 1 から読み取り専用の値を取得し、それをエコーします。
オペコードを調べても、どこが間違っているのかわかりません。オペコードに関するドキュメントが不足していると感じています。また、オペコードを使用した経験がないため、これがどこで間違っているのかを理解できていない可能性があります。
編集1:
最初のコメントで Mike が指摘したように、配列の参照ステータスはコピー時に保持されます。ここでは、 http://php.net/manual/en/language.types.array.php#104064にリンクしている配列の記事の場所とともにドキュメントを見ることができます。この面白いことは警告とは見なされません。これが本当なら、私にとって驚くべきことは、あなたが期待するように、このコードの参照ステータスが保持されていないことです.
したがって、これは参照によって単一の要素を割り当てようとした場合にのみ発生し、この機能がさらに混乱するようです。
php が個別に割り当てられた配列インデックスのステータスのみを保持するのはなぜですか?
編集2:
今日、HHVM を使用していくつかのテストを行いましたが、HHVM はコードの最初のスニップを処理します。私は PHP が大好きですが、HHVM は Zend Engine よりも優れているように見えます。
arm - ワード (4 バイト) が 16 ビット命令か 32 ビット命令かを判別する方法は?
ワード内のバイトが 16 ビット命令または 32 ビット命令を表しているかどうかはどうすればわかりますか?
ARM ARMv7M について言及しましたが、16 ビット命令か 32 ビット命令かを区別する方法が明確ではありません。
それは言う
If bits [15:11] of the halfword being decoded take any of the following values, the halfword is the first halfword of a 32-bit instruction:
• 0b11101
• 0b11110
• 0b11111.
Otherwise, the halfword is a 16-bit instruction
プロセッサは常にハーフワードをフェッチし、それらを調べて、それが 16 ビットか 32 ビットかを判断するということですか?
最初のハーフワードはどういう意味ですか? ワードのビット [31-16] またはビット [15-0] ?
32 ビットの場合、それが 32 ビット命令か 16 ビット命令かを知ることができますか?
ありがとう。
assembly - X86_64 アセンブリでプロシージャを呼び出す
別のプログラムをトレースし、関数呼び出し (near 呼び出し、far 呼び出し、動的リンクなど) をリストする小さなプログラムを作成しています。
目標は、dotty フレームワークのおかげでコールグラフを生成することです。
現在、ptrace(PEEK_TEXT) によって指定されたオペコードのデコードに苦労しています。
インテルの公式ドキュメントを読みました( http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-instruction-set-reference -manual-325383.html )
そして、他の十数のマニュアル。
私が得られないポイントがあります:
1) ptrace(PEEK_TEXT) で指定された単語で 0xE8 オペコードを検索すると、多くのアイテムが見つかりました。たとえば、「objdump -d | grep call」と入力すると、次のようになります。
それで、私のプログラムは同じ数の呼び出しをリストする必要がありますか? 右 ?しかし、代わりに何百もの呼び出しを見つけます...私は正しいもの、上にリストされたものだけでなく、他のものも見つけます。だから私は考えています、それらは実際には値 0xE8 のプレフィックスではありませんか? 彼らは ?その場合、オペコード 0xE8 を値 0xE8 を持つプレフィックスと区別するにはどうすればよいですか?
2) オペコード 0xE8 に続くオフセットが負の場合、私が見つけた唯一の解決策は、バッファーを 0xff で memset し、それをコピーしてビット符号を強制的に 1 にすることです。別の方法がありますか?
3) 誰かが Mod R/M とそれをデコードする方法をもう一度説明できますか?
4) また、値 0x41 の Rex プレフィックスを解釈する方法は? 0x41 0xE8 が、ランダムな値を持つ別のオペコードではなく、プレフィックスを持つ呼び出しであるかどうかを知るにはどうすればよいですか?
わかりにくかったらすいません、それらのトピックは興味深いものですが、ちょっと迷ってしまいました
actionscript-3 - as3commons は実行時に関数呼び出しを生成します
理由により、保護されたメンバーを持つ既存のスーパークラスを持ち、既存のインターフェースを実装するクラスを実行時に生成しています。インターフェイスの各メソッド (およびアクセサー) も生成する必要があります。私が苦労しているポイントは、メソッド本体を正しいオペコードで埋めることです。これは、オペコードを生成または変換したい例です。
関数の名前、引数、戻り値の型、名前空間など、すべての情報が利用可能です。as3commonsのテスト/例に見られるように、関数自体を作成してデフォルト値を返すことができます。
as3commons 以外の lib を使用する必要がありますか?
c++ - 関数ポインタ配列へのルックアップ テーブル C++ のパフォーマンス
私のPC(x86)で基本的なシステムをエミュレートする次のコードがあります:
opcodes[opcode]()
インタープリターのパフォーマンスを改善しようとしています。次のように、すべての関数をインライン化するのはどうですか
それを行うことの利点はありますか?
とにかく速くする方法はありますか?ありがとう