問題タブ [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.
assembly - x86 オペコードのエンコードにおける方向/符号拡張ビット
x86 命令セットでは、オペコードのインデックス 1 のビットは、デスティネーション オペランドとソース オペランドを指定する方向ビットか、符号拡張ビットのいずれかです。
例えばadd
00 /r ADD r/m8, r8
vsそのビットは、同じニーモニックの vs. を区別02 /r ADD r8, r/m8
しますr/m, reg
reg, r/m
81 /0 id ADD r/m32, imm32
対83 /0 ib ADD r/m32, imm8
フル (ビット 1 クリア) 対符号拡張即値 (ビット 1 セット)
これらのケースのどれであるかを判断する最も簡単な論理的な方法は何だろうと思っています。命令オペコードをチェックし、それらを比較してそれがどれであるかを確認する以外にチェックする方法はありますか (命令の符号拡張または方向ビット バリアントの場合)。このビットを無視する命令もありますが、0 に設定されているので問題ありません。
編集: 書き込みエラー (私のコードが意図したもの) の場合、ar/m->reg 命令は決して書き込みエラーをトリガーしないため、reg->r/m が常に当てはまることがわかります。しかし、他の誰かが同様の問題に遭遇した場合に備えて、どんな情報でもいいでしょう.
assembly - R-Format命令セットでfuncはどういう意味ですか?
私はアセンブリ言語に非常に慣れていません。私はMIPSアーキテクチャについて読んでいて、 Register Format(R-Format)の最後のフィールドで立ち往生しています。これがその視覚的表現
です。6番目のフィールドの意味と計算方法を教えてください。前もって感謝します。
assembly - ジャンプターゲットアドレスと分岐ターゲットアドレスを計算する方法は?
アセンブリ言語は初めてです。私はMIPSアーキテクチャについて読んでいましたが、ジャンプターゲットアドレスと分岐ターゲットアドレス、およびそれぞれの計算方法に悩まされています。
assembly - スタックフレームのプッシュ戻り値
関数の戻り値をスタックフレームにプッシュするのが理にかなっているのではないかと思います。
戻り値は主にレジスター(gccの場合はeax)に格納されることは知っていますが、パフォーマンスのためだけですか?
ありがとう!
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は言いますか?どうやって知るのですか?
assembly - "rep; nop;" とはどういう意味ですか? x86アセンブリで意味?「一時停止」命令と同じですか?
- とは
rep; nop
どういう意味ですか? pause
指導と同じですか?rep nop
(セミコロンなし)と同じですか?nop
簡単な説明書との違いは何ですか?- AMD プロセッサと Intel プロセッサでは動作が異なりますか?
- (おまけ) これらの手順の公式ドキュメントはどこにありますか?
この質問の動機
別の質問のコメントでいくつか議論した後rep; nop;
、x86 (または x86-64) アセンブリの意味がわからないことに気付きました。また、ウェブ上で適切な説明を見つけることができませんでした。
それが「次の命令を繰り返す」rep
ことを意味する接頭辞であることは知っています(または、少なくとも古い16ビットx86アセンブリではそうでした)。Wikipediaのこの要約表によると、、、 、でのみ使用できるようです(ただし、この制限は新しいプロセッサでは削除された可能性があります)。したがって、 (セミコロンなしで)操作を繰り返すと思います。cx
rep
movs
stos
cmps
lods
scas
rep nop
nop
cx
しかし、さらに検索した後、私はさらに混乱しました。rep; nop
andはpause
まったく同じ opcodeにマップされているようで、 . 2005 年からのいくつかの古いメールには、別のことが書かれていました。pause
nop
- 「力を入れすぎないように」
- 「2バイトエンコーディングだけで「nop」と同等です。」
- 「それはインテルの魔法です。それは「いいえ、他のHT兄弟を実行させてください」のようなものです」
- 「インテルでは一時停止、Athlon では高速パディングです」
これらの異なる意見で、正しい意味を理解できませんでした。
これは Linux カーネル ( i386とx86_64の両方) で使用されており、次のコメントがあります:同じコメントで BeRTOS/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
でも使用されています。
performance - コンパイルされた言語が最終的に機械語になると、なぜ同等に機能しないのですか?
たとえば、C#、Java、または C++ がすべてマシン コードにコンパイルされる場合、パフォーマンスが同等ではないのはなぜでしょうか?
私の理解では、そのような言語は機械語の抽象化であり、最終的には機械語にコンパイルされます。プロセッサがパフォーマンスを決定するべきではありませんか?
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
なぜEDX
とEAX
がそのようになっているのかがはっきりとわかります。
さて、オーバーフローが発生します。32ビットにそのような膨大な数を格納できないためです。そのため、EDXで余分な8ビットを使用し始めます
しかし、私の質問は、同じ結果を得るために、Cコードでこれをどのように行うのかということです。
こうなると思います
c - ZFフラグにアクセスせずにJNEをCコードに変換する方法を組み立てる
ASMからCへのコードのエミュレートはほぼ完了しました。これらの2番目のパスの問題を解決しようとしています。
このASM関数を取得したとしましょう
私のプログラムはそれのために以下を作成します。
またはJNE 401057
を使用しないのでCMP
TEST
これをCコードで使用するように修正するにはどうすればよいですか?
c - アセンブリ REP STOS を C コードに変換する方法
私は今しばらくデバッグREP STOS DWORD PTR ES:[EDI]
しています
私の結論から、それは常に使用します
ECX
カウンターとして。
コピーされてから何度も追加EAX
される値として、ポイントされたダンプを入れた後EDI
ECX
EDI
EDIを4バイト変更しながら、常にECXのみをカウンターとして使用しているように見えるもので、EDIでポイントされたデータを上書きするようです。カウンターが 0 になると動作を停止します
だから私はこの種のコードを思いついた
うまくいくように見えます..しかし、運と推測の仕事でこれを行ったので心配です。しっかりしていますか?常にデータと同じようにECX
カウンターにEAX
なり、常に4バイトをコピーしますか?