問題タブ [machine-language]
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 - Kip Irvine のアセンブリ言語の本でストレージ割り当てを理解できない
Kip Irvine による Assembly Language for x86という本を読みました。85ページで、彼は記号を使用する理由について次のように書いています。
演算子の使用
DUP
:演算子を使用して配列と文字列のストレージを作成するSection 3.4.4
方法を示しました。DUP
で使用されるカウンターはDUP
、プログラムのメンテナンスを簡素化するために、記号定数にする必要があります。次の例では、COUNT が定義されている場合、次のデータ定義で使用できます。
このコマンドの意味がわかりません。誰かが私にそれが何を意味するのか説明できますか?
c++ - 関数ポインタ配列へのルックアップ テーブル C++ のパフォーマンス
私のPC(x86)で基本的なシステムをエミュレートする次のコードがあります:
opcodes[opcode]()
インタープリターのパフォーマンスを改善しようとしています。次のように、すべての関数をインライン化するのはどうですか
それを行うことの利点はありますか?
とにかく速くする方法はありますか?ありがとう
assembly - IAS コンピューターのメモリ内容をアセンブリ言語に変換する方法
次のメモリ内容が与えられた場合
アセンブリ コードは次のとおりです。
私の質問は、コンテンツがアセンブリ コードにどのように変換されるかです。ここでメモリの内容のオペランドからオペコードを分離するものは何ですか?
c++ - char配列に格納されたマシンコードを呼び出す方法は?
ネイティブの機械語コードを呼び出そうとしています。これが私がこれまでに持っているものです(バスエラーが発生します):
関数を正しく呼び出し、ret 命令に到達します。しかし、ret 命令を実行しようとすると、SIGBUS エラーが発生します。実行のためにクリアされていないページでコードを実行しているためですか?
それで、私はここで何が間違っていますか?
stack - CPUはスタックからリターンアドレスを取得する方法
cpu は、呼び出し元関数によってプッシュされたスタックから戻りアドレスを取得する方法を教えてください。彼はそれが他のものではなく返送先住所であることをどのように知っていますか?
assembly - LEGv8 でマシン命令をアセンブリにデコードするにはどうすればよいですか?
LEGv8 マシン命令がどのようにデコードされるかがわかりません。次のバイナリを想定します。
1000 1011 0000 1111 0000 0000 0001 0011
デコードに役立つはずの次のチャートがあります。
最初の 11 ビット10001011000は 10 進数の1112に対応し、チャートによるとこれはADD命令です。だから私は命令のこの部分を決定する方法を知っています (より良いアプローチがない限り、これは 11 ビットではないオペコードでは機能しないのでしょうか?)。この時点で、私はどのように進めるべきかについて混乱しています。
ADD は命令形式R形式であることを知っているため、ビットは次のように配置されます。
opcode: 11 ビット
Rm: 5 ビット
shamt: 6 ビット
Rn: 5 ビット
Rd: 5 ビット
これらのフィールドサイズを知っている最初のバイナリマシン命令をレイアウトしようとしています...
opcode = 1000 1011 000 0 1111 0000 0000 0001 0011 = 10001011000
これは、最初のバイナリ マシン命令の最初の 11 ビットです。
Rm = 1000 1011 000 0 1111 0000 0000 0001 0011 = 01111
これは、オペコードの最初の 11 ビットの後の次の 5 ビットです。
shamt = 1000 1011 0000 1111 0000 00 00 0001 0011 = 000000
これは、Rm の 5 ビットの次の 6 ビットです。
Rn = 1000 1011 0000 1111 0000 00 00 000 1 0011 = 00000
これは、シャムの 6 ビットの次の 5 ビットです。
Rd = 1000 1011 0000 1111 0000 0000 000 1 0011 = 10011
これはバイナリ マシン命令の最後の 5 ビット (Rn の 5 ビットの後の 5 ビット) です。
Rm、Rn、Rd を 2 進数から 10 進数に変換すると、次のようになります。
Rm = 15 = X15
Rn = 0 = X0
Rd = 19 = X19
したがって、最初のバイナリ マシン命令をアセンブリ ステートメントにデコードするための私の最終的な答えは、ADD X19, X0, X15 になります。
ただし、この例の教科書の回答はADD X16, X15, X5です。どこで私は間違えましたか?
assembly - edx の以前の値を使用したアセンブリ DIV 操作
私はアセンブリが初めてで、学習している本にこの例がありました
そして、それらは私が得ている結果 です
* EDXの最終値が0x47である理由を誰か説明してもらえますか?
* EDXに0hを入力すると、 EAXの最終値が0x2になるのはなぜですか?
*基本的に分割がEAXとEBXの間にある場合、 EDXは分割結果にどのように影響しますか。
※ EDXはディビジョンレストを収納するためだけのものではないですか?
前もって感謝します :)
assembly - PDP-11アセンブリ言語をバイナリと16進にエンコード/デコードしますか?
ADD
ユーザーが仮想的に PDP-11 命令 ( 、SUB
、 、MOV[B]
に限定されます) をエンコード/デコードできるアプリケーションの Encode および Decode ボタンの actionPreformed メソッドを作成する割り当てが与えられましたCMP[B]
。アプリケーションは、4 桁の 16 進数または 16 桁のバイナリを取得してアセンブリにデコードするか、アセンブリ命令の 1 つを入力してバイナリ/16 進数にエンコードできると想定されています。
これは私にとってかなり新しいことであり、これを行う方法について頭を悩ませているようには見えません。誰かがこのプロセスをもう少し簡単に分解する方法を持っているか、どこから始めるべきかの指針を持っていますか? どこから始めればよいかよくわかりません。ありがとうございました!
assembly - x86 アーキテクチャで命令のオペコードを変更することは可能ですか、それとも難しいですか?
たとえばPUSH imm32
、オペコードは 68h です。この命令を「表す」ために別の番号、たとえば 69h を使用することはできますか (この番号は他の命令で使用されていないと仮定します)。
「表す」とは、アセンブリ内に PUSH 命令がある場合、69h がバイナリ実行可能ファイルに表示されることを意味します。最終的に CPU によってフェッチおよび実行されると、68h に戻されます。
各オペコードが CPU 回路に合わせて特別に設計されていることは理解していますが、別の 16 進数を代理として使用することは可能ですか?
もちろん、CPU を変更するつもりはありませんが、x86 アーキテクチャで命令を実行したいと考えています。
更新: なぜこの質問をするのですか?
意図的に機械語の流れを誤解し、標準ライブラリの中に C3 (つまり ret) が多いことを利用する Return Oriented Attack をご存知でしょうか。私が最初に考えたのは、リターンのオペコードを C3 から他のコード (できれば 2 バイト) に変更できれば、ROA は機能しないということでした。私は建築分野の専門家ではないので、自分の考えが現実にはうまくいかないことに気づきました。ご回答ありがとうございます。