問題タブ [addressing-mode]

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 に答える
12492 参照

assembly - MIPSアドレッシングモードでのレジスタ間接とベースプラスオフセットの違いは?

レジスタ間接ベースプラスオフセットの違いは何ですか?また、MIPSアーキテクチャでアセンブリを記述する方法にどのように影響しますか?これは、命令内のレジスタのみを参照できることを意味し、そのレジスタはより多くの命令を指す必要があると思いますか?

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

assembly - アセンブリ スタック インデックス アドレス

ollydbg を使用してプログラムをデバッグしようとしていますが、SS プレフィックスを使用してモード アドレスをインデックス化することに疑いがあります。

スクリーンショットは次のとおりです。

このとき、指示は

からの 8 ビットを、1 を引いた でEBX指定されたアドレスに移動します。EBP(0012FDCC)0012FDCB

上記が正しくない場合は、教えてください。

ollydbg プログラムでは、右下にアドレスへの最初の列を持つスタックの表現があります。指して0012FDCBいる場所へのエントリがないのはなぜですか?0012FDCB

0 投票する
3 に答える
17710 参照

assembly - ARMアセンブリ:ストアの自動インクリメントレジスタ

STRのレジスタのベースアドレスを?で自動インクリメントすることは可能[Rn]!ですか?私はドキュメントを調べましたが、主にコマンド構文がLDRとSTRの両方で提示されているため、明確な答えを見つけることができませんでした-理論的には両方で機能するはずですが、autoの例は見つかりませんでした-ストアでインクリメントします(ロードは正常に機能します)。

2つの数値をベクトルに格納する小さなプログラムを作成しました。それが完了すると、の内容はあるoutはずです{1, 2}が、自動インクリメントが機能していないかのように、ストアは最初のバイトを上書きします。


編集:答えは通常のロードとストアには正しかったのですが、オプティマイザーがvldm/vstmなどのベクトル命令の自動インクリメントを台無しにしていることがわかりました。たとえば、次のプログラム

でコンパイル

オプティマイザはインクリメントされた変数を保持し、それをprintfに使用しているため、最後の8つの変数の出力にジブリッシュが発生します。言い換えると、out[i]は実際out[i+8]にはです。したがって、最初の8つの出力値は、ベクトルの最後の8つであり、残りは範囲外のメモリ位置です。

コード全体でキーワードのさまざまな組み合わせを試しましvolatileたが、動作が変わるのは、-O0フラグを使用してコンパイルした場合、またはポインターの代わりに揮発性ベクトルを使用した場合のみです。

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

assembly - GDT を使用した保護モードでのアセンブラー ジャンプ

現在、低レベルのプログラミング スキルを磨くために、x86 アセンバーをいじっています。現在、32 ビット プロテクト モードでのアドレッシング スキームに関する小さな問題に直面しています。

状況は次のとおりです。

CPU を保護モードに切り替え、コード内の対応するラベルにジャンプするプログラムを 0x7e0 にロードしました。

これまでのところ、これはまったく問題なく機能します。「jmp ProtectedMode」は、プリフェッチ キューをクリアするための明示的な far jump なしで機能します。このプログラムはオフセット 0 (最初は org 0) でロードされるため、コード セグメントが正しい場所を指すようになります。

私の現在の問題は、「ProtectedMode」ラベル内で、0x8000 にロードされている他のプログラムにジャンプしたいということです (これをメモリ ダンプで確認したところ、ロード機能は正しく機能し、プログラムは 0x8000 に正しくロードされました)。 .

CPU が RealMode ではなく ProtectedMode になったため、アドレス指定スキーマが異なります。ProtectedMode は記述子セレクターを使用して記述子テーブルのベース アドレスと制限を検索し、指定されたオフセットを追加して物理アドレスを取得します (私が理解しているように)。そのため、ProtectedMode に入る前に GDT をインストールする必要がありました。

私は次のようになっています:

経由で GDT レジスタにロードされます。

これまで理解できなかったのは、GDT を使用して ProtectedMode の物理アドレス 0x8000 にジャンプするにはどうすればよいかということです。

私の最初の考えは、0x7e00 (現在のプログラムがロードされている場合) を指すコード記述子 (CODE_DESC) を選択し、0x8000 (512 バイト) に到達するために必要なオフセットを使用して、ジャンプ命令を作成することでした:

しかし、これはうまくいきません。

どちらも機能しません...

ここで何が欠けているのか分かりますか? 32 ビット ProtectedMode アドレッシング スキームと GDT の使用法に不可欠な要素を理解していなかったのかもしれません。

[編集] 完全なコード:

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

assembly - 組み立て説明書

私はこれを正しく読んでいることを確認したいだけです:

最初の行を次のように読み取ります: edx = [epb + 12]、2 行目を次のように読み取ります。eax = edx + edx*4

誰でも明確にできますか?

また、次の 2 行がある場合はどうなるでしょうか。

2 行目が実行されると、eaxレジスタは上書きされますか?

そして、eax = edx + edx*4アドレスに4を掛けていますか?それとも4によるアドレスの内容?

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

assembly - x86リー命令

x86 の LEA 命令をよく理解しようとしています。

これらの2行を考えると、私はそれを知っています:

eax = edx + edx*4

その後

eax = edx + edx*2

2 つの質問です。まず、これらの命令がこの例のように順番に表示される場合、2 行目が実行されると eax レジスタが上書きされますか? そして、正確には何がレジスタにロードされるのでしょうか? 別の住所?それとも、これらのレジスタが指す値に対して算術演算を行っているのでしょうか?

0 投票する
7 に答える
27806 参照

assembly - x86-64 AT&Tアセンブリで、アドレスの前のアスタリスク*はどういう意味ですか?

次の行はどういう意味ですか?

メモリアドレスの前のアスタリスクはどういう意味ですか?また、メモリアクセスメソッドに最初のレジスタ値がない場合、それはどういう意味ですか?

通常は( "%register"、%rax、8)のようなものですが、この場合、最初のレジスタはありません。

任意のヒント?

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

assembly - この x86 アドレッシング モードはどのように機能しますか?

al のようなものには esi + ecx + 1 のアドレスが含まれますか?

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

assembly - アセンブリコードと「lea」のアドレス

私が言うなら:

私はそれが本質的に意味することを教えられました:

このフォーマットはどのように機能しますか?

そして、これは2番目の質問につながると思います。私がこのようなものを持っている場合:

第1オペランドが第2オペランドに追加され、第2オペランドに格納されることは理解していますが、ここでも、第1オペランドの表記がわかりません。別の例は、私が持っていた場合です:

...、これは、%eaxの値が次の値と比較されていることを意味しますか?

...?このようなものをたくさん検索してみましたが、意味のある答えを見つけるために正しい単語を使用していなかったと思うので、ここに投稿することにしました。

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

x86 - Linux での IA32 からのオペランドおよび操作へのアクセス

私は大学のためにしなければならないこの宿題に少し混乱しています。レジスタとは何か、メモリまたはレジスタにバイトを入れる理由は理解していますが、これについてプッシュするのに非常に役立ちます最初の演習:

(Gnu アセンブリ):

示されたオペランドに対応する値を次の表に記入してください。

これを見てわかることは、最初のオペランドは0x100の 16 進値を持ち、レジスタであり、2 番目のオペランドは前に何もないためわかりません。オペランド、それが取得する値がわからない。

4(%eax) はおそらくメモリ アドレスで、4 は変位です。この時点からはわかりません...

私の疑問が何であるかを理解するために必要なだけ明確であったことを願っています。提供された助けに感謝します。

よろしく、スーザ。