問題タブ [opcode]
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.
translation - マシンコードから LLVM IR への変換 (X86_64.X86.ARM から LLVM ビットコードへの逆アセンブリ/再アセンブリ)
X86_64、x86、ARM 実行可能ファイルを LLVM IR (逆アセンブリ) に変換したいと考えています。
どのような解決策を提案しますか?
c - C に埋め込まれたアセンブリ コードにより、cmp の不適切なオペランド タイプ エラーが発生する
数値が正か負かゼロかをチェックするプログラムを作成しました。コードをコンパイルしようとすると、cmp オペコードである 28 行目で不適切なオペランド タイプ エラーが発生します。フォーマットが間違っていますか、それとも他の問題がありますか?
c# - Why does C# compiler emit additional OpCodes in IL?
If I've a method Multiply
defined as:
Then why does the compiler emit this IL:
As you can see, it also contains some additional OpCodes which don't make sense to me, when in fact I expect the following IL:
which does the very same thing.
So the question is, why does the compiler emit additional OpCodes in IL?
I'm using Debug mode.
c++ - unsignedint+文字列をunsignedcharベクトルにキャストする
NetLinkソケットライブラリ(https://sourceforge.net/apps/wordpress/netlinksockets/)を使用していて、指定した形式でネットワーク経由でバイナリデータを送信したいと考えています。
私が計画したフォーマットは非常に単純で、次のとおりです。
バイト0および1:タイプuint16_tのオペコード(つまり、符号なし整数は常に2バイト長)
バイト2以降:文字列、整数、それぞれの組み合わせなど、必要なその他のデータ。相手方は、オペコードに従ってこのデータを解釈します。たとえば、「ログイン」を表すオペコードが0の場合、このデータは、ユーザー名の長さを示す1バイト整数、ユーザー名を含む文字列、パスワードを含む文字列で構成されます。オペコード1「チャットメッセージを送信する」の場合、ここのデータ全体はチャットメッセージの単なる文字列である可能性があります。
ただし、ライブラリがデータを送信するために使用できるものは次のとおりです。
これにはrawSend()を使用したいと思いますが、rawSend()は、メモリへのvoid *ポインタではなく、unsigned charsを取りますか?特定のタイプのデータをunsignedcharの配列にキャストしようとすると、ここでデータがいくらか失われることはありませんか?私が間違っている場合は訂正してください。しかし、私が正しい場合、これは、実際のバイナリデータ転送をサポートしている別のライブラリを調べる必要があることを意味しますか?
このライブラリが私の目的を果たしていると仮定すると、さまざまなデータ型を1つのstd :: vectorにキャストして連結するにはどうすればよいでしょうか?私が試したのは次のようなものです。
ただし、データを解釈しようとしたときに、いくつかの例外が発生しました。キャスティングに近づいていますか?unsigned charsにキャストするとデータが失われますか?
前もって感謝します。
c++ - C ++では、ビットシフトとキャストデータ型に関して
私は最近、Stack Overflowで、16ビット整数からデータをキャストし、その後に未定の量のvoid*キャストメモリを既知のソケットライブラリを使用するためにunsignedcharsのstd::vectorにキャストする方法について質問しました。署名が次のような関数を使用して生データを送信するNetLinkとして:
(参考のために、ここにその質問があります:unsigned int +文字列をunsignedcharベクトルにキャストします)
質問への回答に成功し、回答してくださった方々に感謝いたします。Mike DeSimoneは、データをNetLinkが受け入れる形式(std :: vector)に変換するsend_message()関数の例で応答しました。これは次のようになります。
これはまさに私が必要としていたもののように見えるので、付随するreceive_message()関数の作成に着手しました...
...しかし、私はすべてのビットシフトなどを完全には理解していないと言うのが恥ずかしいので、ここで壁にぶつかりました。私が過去10年近くに書いたすべてのコードでは、ほとんどのコードは高級言語で書かれており、残りのコードは実際には低レベルのメモリ操作を要求していません。
receive_message()関数の記述に戻ると、ご想像のとおり、私の出発点はNetLinkのrawRead()関数であり、その署名は次のようになります。
私のコードは次のように始まります。
rawRead()を最初に呼び出した後、ベクターを反復処理し、ベクターからデータを取得してビットシフト操作を元に戻し、データを*rawDataと*opcodeに返す必要があるようです。繰り返しになりますが、私はビットシフトにあまり精通していません(構文を理解するためにグーグルを実行しましたが、上記のsend_message()コードがシフトを必要とする理由をまったく理解していません)。ここ。
誰かがこの付随するreceive_message()関数の書き方を理解するのを手伝ってもらえますか?ボーナスとして、誰かが元のコードを説明して、将来的にそれがどのように機能するか(特に、この場合のシフトがどのように機能し、なぜそれが必要なのか)を知ることができれば、それは将来の私の理解を深めるのに役立ちます。
前もって感謝します!
c - 不明なオペコード'.pword'
コードをコンパイルすると、不明なオペコード'.pword'エラーが発生します。私のプロジェクトで.pwordを含む唯一のコード行は次のとおりです。
行をコメントアウトしても何も起こりません。
検索.pword 0xDA4000
したところ、IDE MPLabforPICでサポートされていることがわかりました。
私の場合、使用しているIDEはSTMf32f2xxチップ用のCrossStudioです。
binutils2.21とgcc4.6.0に付属する更新されたCrossStudioがあります
名前のない構造体と共用体のコンパイルで最初は問題がありましたが、-fms-extensions
追加のCコンパイラオプションに追加すると修正されました。
Opcode'.pword'エラーを修正するために同様のことをする必要があるかどうかわかりません。
.pwordがPICオペコードにすぎないというだけでしょうか。
valgrind - syscall brk のバイナリ計測を行うには? (x86-64 Linux) (たぶん valgrind?)
特定のバイナリ(できれば、呼び出しを行う実際のsyscall / sysenterレベル(x86-64およびx86)で)にインストルメントsyscall brk
化(および他の呼び出しですが、これは私にとって最も重要です)したいと思います。sys_brk
主な目標:
- 投獄されたプロセスに一定量のメモリを与えるサンドボックスの一部
brk
そのため、システム コール (および次の順序で最も可能性が高い他のコール)を取り除き、固定 limitの下でメモリ割り当てをシミュレートしたいと考えています。固定制限は、プログラムに使用できるメモリ空間です。(利用可能なメモリ量が固定された一種のサンドボックスを作るようなものと考えることができます)
いくつかの可能な解決策(またはあなたの解決策)の例(の1つ)を実装する方法:
- 指示を変更するだけです
NOP
- 成功時に 0 を返すように、成功時に呼び出されるように
brk
、メモリ (レジスタ) の状態を設定する操作を設定して、成功をシミュレートします。brk
- より複雑な...固定制限の下で成功メモリ割り当てをシミュレートするコード(または関数呼び出し)を備えたインストゥルメント。
- このsyscallを関数呼び出しに変更し、提供された関数をバイナリに追加するのが最も柔軟です(私の場合はやり過ぎかもしれません)。
与えられたバイナリは、次の 2 つの形式のいずれか (最も望ましいのは両方:) で悪意のある可能性があるコードです。
- 共有ライブラリ - ここでは、関数呼び出しの前に環境をセットアップできます (たとえば、制御された方法で brk 呼び出しを行います)
- プログラム バイナリ - この場合、プログラムに一定量のメモリを与える必要があります (呼び出し元によって、またはプログラムの開始時に「1 つのシステム コール」で)、メモリを割り当てることができないためです。そのようなプログラムを呼び出す例は、回答に含める必要があります。
問題は他の多くの側面と密接に関連しているため、質問として区切るように最善を尽くしましたが、多かれ少なかれ何かを指定する必要がある場合は、アドバイスをお願いします。
実装に関する回答、リソース (本、チュートリアル) へのリンクは大歓迎です。
(私が最も興味を持っているのはLinuxであり、信頼できるソリューションです。これにより、アセンブラーでもバイナリを準備する人々がコードの実行について心配する必要がなくなります)
x86 - x86 でプレフィックスと必須プレフィックスを繰り返す
x86 arch に固有の Linux 用の小さな逆アセンブラーを作成しようとしているときに、小さな問題に直面しました。必須のプレフィックスと繰り返しプレフィックスに関するものです。Intel ドキュメント [1] を見ると、繰り返しプレフィックスは0xf2または0xf3であり、必須プレフィックスは0x66、0xf2または0xf3であると言われています。
次の基本オペコードを持つ 2 つの命令があります。
crc32 -- f2 0f 38 f0 (ここで、0xf2 は必須のプレフィックスです)
movbe -- 0f 38 f0
したがって、カウンタ レジスタがゼロでない限り繰り返す必要がある「movbe」命令のオペコードは次のようになります。
repnz movbe == f2 0f 38 f0
命令の逆アセンブルを開始するときに、バイト0xf2が表示されている場合、それが crc32 命令の必須プレフィックスであるが、movbe命令の繰り返しプレフィックスではない、またはその逆であることをどのように確認できますか? オペコード パターン「f2 0f 38 f0」と一致する命令はどれですか?
私は何が欠けていますか?
[1] http://www.intel.com/design/intarch/manuals/243191.HTM
ありがとう、よろしく、
Hrishikesh Murali
assembly - JMPオペコードを計算する
ジャンプの正しいopコードを計算しようとしていますが、他のスレッドでこれを調べましたが、まだわかりません。
数式は機能していると思ってdesination - (from+5)
いましたが、機能していませんでした。かなり離れています。ジャンプしたいアドレスは次のとおりです。
だから私はこれに問題があります、どんな助けもありがたいです。