問題タブ [machine-code]

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.

0 投票する
2 に答える
1880 参照

assembly - x86 オペコードのエンコードにおける方向/符号拡張ビット

x86 命令セットでは、オペコードのインデックス 1 のビットは、デスティネーション オペランドとソース オペランドを指定する方向ビットか、符号拡張ビットのいずれかです。

例えばadd

  • 00 /r ADD r/m8, r8vsそのビットは、同じニーモニックの vs. を区別02 /r ADD r8, r/m8
    しますr/m, regreg, r/m
  • 81 /0 id ADD r/m32, imm3283 /0 ib ADD r/m32, imm8
    フル (ビット 1 クリア) 対符号拡張即値 (ビット 1 セット)

これらのケースのどれであるかを判断する最も簡単な論理的な方法は何だろうと思っています。命令オペコードをチェックし、それらを比較してそれがどれであるかを確認する以外にチェックする方法はありますか (命令の符号拡張または方向ビット バリアントの場合)。このビットを無視する命令もありますが、0 に設定されているので問題ありません。

編集: 書き込みエラー (私のコードが意図したもの) の場合、ar/m->reg 命令は決して書き込みエラーをトリガーしないため、reg->r/m が常に当てはまることがわかります。しかし、他の誰かが同様の問題に遭遇した場合に備えて、どんな情報でもいいでしょう.

0 投票する
2 に答える
9036 参照

assembly - R-Format命令セットでfuncはどういう意味ですか?

私はアセンブリ言語に非常に慣れていません。私はMIPSアーキテクチャについて読んでいて、 Register Format(R-Format)の最後のフィールドで立ち往生しています。これがその視覚的表現 ここに画像の説明を入力してください です。6番目のフィールドの意味と計算方法を教えてください。前もって感謝します。

0 投票する
4 に答える
117331 参照

assembly - ジャンプターゲットアドレスと分岐ターゲットアドレスを計算する方法は?

アセンブリ言語は初めてです。私はMIPSアーキテクチャについて読んでいましたが、ジャンプターゲットアドレス分岐ターゲットアドレス、およびそれぞれの計算方法に悩まされています。

0 投票する
1 に答える
1385 参照

assembly - スタックフレームのプッシュ戻り値

関数の戻り値をスタックフレームにプッシュするのが理にかなっているのではないかと思います。

戻り値は主にレジスター(gccの場合はeax)に格納されることは知っていますが、パフォーマンスのためだけですか?

ありがとう!

0 投票する
4 に答える
1146 参照

compilation - プログラミング言語Xの1つのステートメントで何行の機械語が生成されますか?

Lost Programming Skillsに関する記事を読んで、著者はこのチャットを持ち出します。

私:どのくらいの馬力が必要ですか?
SE:わかりません。
私:見てみましょう、メインループには何行のコードがありますか?
SE:10,000。
私:何語?
SE:Fortran
Me:わかりました。これは、Fortranの1行あたり約10行のマシンコードなので、ループあたり100,000命令です。ループは1秒間に何回実行されますか?
SE:1/20秒ごと。
私:わかりました。つまり、20 x 100,000 = 2mops(当時のどの速度よりも速かった)です。これを考え直したほうがいいかもしれません。

それは私に不思議に思います、現代語の数は何ですか、Rubyは言いますか?どうやって知るのですか?

0 投票する
2 に答える
27467 参照

assembly - "rep; nop;" とはどういう意味ですか? x86アセンブリで意味?「一時停止」命令と同じですか?

  • とはrep; nopどういう意味ですか?
  • pause指導と同じですか?
  • rep nop(セミコロンなし)と同じですか?
  • nop簡単な説明書との違いは何ですか?
  • AMD プロセッサと Intel プロセッサでは動作が異なりますか?
  • (おまけ) これらの手順の公式ドキュメントはどこにありますか?

この質問の動機

別の質問のコメントでいくつか議論した後rep; nop;、x86 (または x86-64) アセンブリの意味がわからないことに気付きました。また、ウェブ上で適切な説明を見つけることができませんでした。

それが「次の命令を繰り返す」repことを意味する接頭辞であることは知っています(または、少なくとも古い16ビットx86アセンブリではそうでした)。Wikipediaのこの要約表によると、、、 、でのみ使用できるようです(ただし、この制限は新しいプロセッサでは削除された可能性があります)。したがって、 (セミコロンなしで)操作を繰り返すと思います。cxrepmovsstoscmpslodsscasrep nopnopcx

しかし、さらに検索した後、私はさらに混乱しました。rep; nopandはpause まったく同じ opcodeにマップされているようで、 . 2005 年からのいくつかの古いメールには、別のことが書かれていました。pausenop

  • 「力を入れすぎないように」
  • 「2バイトエンコーディングだけで「nop」と同等です。」
  • 「それはインテルの魔法です。それは「いいえ、他のHT兄弟を実行させてください」のようなものです」
  • 「インテルでは一時停止、Athlon では高速パディングです」

これらの異なる意見で、正しい意味を理解できませんでした。

これは Linux カーネル ( i386x86_64の両方) で使用されており、次のコメントがあります:同じコメントで BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */でも使用されています。

0 投票する
5 に答える
606 参照

performance - コンパイルされた言語が最終的に機械語になると、なぜ同等に機能しないのですか?

たとえば、C#、Java、または C++ がすべてマシン コードにコンパイルされる場合、パフォーマンスが同等ではないのはなぜでしょうか?

私の理解では、そのような言語は機械語の抽象化であり、最終的には機械語にコンパイルされます。プロセッサがパフォーマンスを決定するべきではありませんか?

0 投票する
1 に答える
2933 参照

c - アセンブリIMULオペコード(オペランドが1つのみ)をCコードに変換する方法

私が得たと言う

EDX = 0xA28

EAX = 0x0A280105

このASMコードを実行します

IMUL EDX

私の理解では、これはEAXのみを使用します。1つのオペランドが指定されている場合

したがって、Cコードでは次のようになります。

EAX *= EDX;

正しい?

デバッガーを調べた後..私EDXも変更されていることがわかりました。

0x0A280105 * 0xA28 = 0x67264A5AC8

デバッガーで

EAX = 264A5AC8 EDX = 00000067

今、あなたが答えを取り、0x67264A5AC8最初のヘックスペアを分割すると、0x67 264A5AC8 なぜEDXEAXがそのようになっているのかがはっきりとわかります。

さて、オーバーフローが発生します。32ビットにそのような膨大な数を格納できないためです。そのため、EDXで余分な8ビットを使用し始めます

しかし、私の質問は、同じ結果を得るために、Cコードでこれをどのように行うのかということです。

こうなると思います

0 投票する
1 に答える
553 参照

c - ZFフラグにアクセスせずにJNEをCコードに変換する方法を組み立てる

ASMからCへのコードのエミュレートはほぼ完了しました。これらの2番目のパスの問題を解決しようとしています。

このASM関数を取得したとしましょう

私のプログラムはそれのために以下を作成します。

またはJNE 401057を使用しないのでCMPTEST

これをCコードで使用するように修正するにはどうすればよいですか?

0 投票する
1 に答える
8365 参照

c - アセンブリ REP STOS を C コードに変換する方法

私は今しばらくデバッグREP STOS DWORD PTR ES:[EDI]しています

私の結論から、それは常に使用します

ECXカウンターとして。 コピーされてから何度も追加EAXされる値として、ポイントされたダンプを入れた後EDIECXEDI

EDIを4バイト変更しながら、常にECXのみをカウンターとして使用しているように見えるもので、EDIでポイントされたデータを上書きするようです。カウンターが 0 になると動作を停止します

だから私はこの種のコードを思いついた

うまくいくように見えます..しかし、運と推測の仕事でこれを行ったので心配です。しっかりしていますか?常にデータと同じようにECXカウンターにEAXなり、常に4バイトをコピーしますか?