問題タブ [relative-addressing]
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 - AVR用のgnuアセンブラを使用してPCに対してジャンプするにはどうすればよいですか?
avr-objcopyを使用して逆アセンブルしたバイナリファイルがあります。割り込みベクタテーブルは次のようになります。
いくつかの変更を加えて、このファイルを再構築したいと思います。最初の2列を削除して、通常のアセンブリファイルになるように再フォーマットしました。すなわち:
しかし、私が走ると
次に、生成されたファイルを逆アセンブルします。(objcopy -S a.outを使用)出力は次のようになります。
では、PC相対ジャンプを尊重するために、どうすればavrを取得できますか?
gcc - 定数データの %pc 相対アドレスを生成しています
gcc%pc
に定数の相対アドレスを生成させる方法はありますか? 文字列がテキスト セグメントに表示される場合でも、arm-elf-gcc はデータへの定数ポインターを生成し、%pc
相対アドレスを介してポインターのアドレスをロードし、逆参照します。さまざまな理由から、中間のステップをスキップする必要があります。例として、この単純な関数:
を生成します (でコンパイルした場合arm-elf-gcc-4.3.2 -nostdlib -c
-O3 -W -Wall logfile.c
):
私はそれがもっと次のようなものを生成することを期待していたでしょう:
問題のコードは、ロード時にメモリ内で再配置されるため、部分的に位置に依存しない必要がありますが、コンパイルされていないコードと統合される-fPIC
ため、グローバル オフセット テーブルはありません。
私の現在の回避策は、非インライン関数(相対アドレスを介して行われます)を呼び出して、コードの動作%pc
と同様の手法でコンパイルされた場所からのオフセットを見つけることです。-fPIC
ただし、この手法ではすべてのデータ参照を手動で修正する必要があるためfilename()
、上記の例の関数は次のようになります。
assembly - 相対ポインターを使用したデータのアドレス指定(x86-32アセンブラー)
私は32ビットx86アセンブラーで書いていますが、コードと常に同じ関係にあるデータをアドレス指定する方法がよくわかりません。絶対アドレスを計算するためにEIPを使用する必要がありますか、それともより良い方法がありますか?
gcc - x86-64 で gcc を使用して、さまざまな変数に対して RIP 相対または絶対アドレス指定を選択できますか?
2 つの異なるデータ セクション (A と B) に異なる変数を配置する独自のリンク スクリプトを作成します。
A はゼロアドレスにリンクされています。B はコードの近くで、高アドレス空間 (x86-64 の通常の絶対アドレス指定では使用できない 4G より高い) にリンクされています。
A は絶対アドレス指定でアクセスできますが、RIP 相対ではアクセスできません。B は RIP 相対アドレッシングを介してアクセスできますが、絶対アクセスはできません。
私の質問: gcc のさまざまな変数に対して RIP 相対または絶対アドレス指定を選択する方法はありますか? おそらく、次のような注釈が付いてい#pragma
ますか?
python - PyCUDAメモリアドレス指定:メモリオフセット?
デバイス上に大量の生成データ (A[i,j,k]) がありますが、必要なのは A[i,:,:] の 1 つの「スライス」だけです。通常の CUDA では、これは簡単に実行できます。いくつかのポインター演算で達成されます。
pycuda内で同じことを行うことはできますか? すなわち
(dest 形状から推測されない限り) サイズ情報がないため、明らかにこれは完全に間違っていますが、うまくいけば、アイデアを得ることができますか?
nasm - データ セグメントからのテキスト セグメントへのポインタ
x86-64 でこの相対アドレス指定を使用して次のことを行うことは可能ですか?
OS X で nasm を使用してこの方法を実行すると、次のリンカ警告が表示されます。
ld: 警告: PIE が無効になっています。絶対アドレス指定 (おそらく -mdynamic-no-pic) は、コード署名された PIE では許可されていませんが、/var/tmp/tmp.1.Ho4qKA のいずれかで使用されています。この警告を修正するには、-mdynamic-no-pic でコンパイルしたり、-Wl,-no_pie でリンクしたりしないでください。
memory-management - x86 での RIP 相対アドレッシング
私は x86 アセンブラーの経験があまりなく、 mach_inject のバグに関連する問題をデバッグしようとしています。
元のコードは次のようになります ( mach_inject
mach_inject.c の関数):
それから少し後で ( INJECT_ENTRY
mach_inject_bundle_stub.c の機能):
私にとっては、これを x86 用にコンパイルすると失敗するようです。すべてのアーキテクチャ (つまり、x86 用) だけにコードを変更するとimageOffset = 0;
、すべて正常に動作します。
それで、いくつかの質問:
- RIP 相対アドレッシングは 32bit/x86 モードでも使用できますか?
- とにかく32ビットモードのRIP相対アドレッシングもある場合、このコードの(おそらく)最初の意図は何でしたか?
- RIP 相対アドレス指定はコンパイラの設定ですか? または、コードで RIP 相対アドレス指定を使用するかどうかをどのように制御できますか? (または、このバグにもっと関連しています:
imageOffset = 0;
常に正しいですか? または、正しくないのはいつですか?)
linux - 32ビットモードのNASMx86_64アセンブリ:この命令がRIP相対アドレス指定コードを生成するのはなぜですか?
ここでの基本的なことは、Linuxのsys_writeシステムコールに渡すためにhello文字列の長さが必要であるということです。今、私はEQUを使用するだけで問題なく動作することをよく知っていますが、ここで何が起こっているのかを本当に理解しようとしています。
したがって、基本的にEQUを使用すると、値が読み込まれ、問題ありません。
ただし、この行をDBで使用すると
私が期待するようにそのアドレスに値をロードする代わりに、アセンブラーはgdbデバッガーに示されているようにRIP-Relative Addressingを出力しますが、なぜだろうと思っています。
代わりにeaxレジスタを使用してみました(そしてeaxをedxに移動しました)が、別の問題が発生します。gdbに記載されているように、セグメンテーション違反が発生します。
明らかに、異なるレジスタは異なるコードを生成します。どういうわけか上位32ビットを切り捨てる必要があると思いますが、その方法がわかりません。
「解決策」を見つけたのですが、次のようになります。eaxにstr_hello_lengthのアドレスをロードしてから、eaxが指すアドレスの内容をロードすると、すべてが厄介です。
どうやらmemアドレスから間接的に値をロードしようとすると、異なるコードが生成されますか?よくわかりません。
これらの命令の構文と操作を理解するのに助けが必要なだけなので、効果的なアドレスをロードする方法をよりよく理解できます。ええ、私はEQUに切り替えて陽気な道を進むことができたと思いますが、DB宣言とそのアドレスからのロードで何が起こっているのかを理解するまで、私は本当に先に進むことができないと感じています。
multithreading - アセンブリ/マルチタスクでのメモリアドレス指定
マシンコードのプログラムがメモリからレジスタに値をロードしたり、ジャンプを実行したり、レジスタに値をメモリに格納したりする方法は理解していますが、これが複数のプロセスでどのように機能するかはわかりません。プロセスにはその場でメモリが割り当てられるので、相対アドレス指定を使用する必要がありますか?これは自動的に行われますか(相対ジャンプなどを実行するアセンブリ命令があることを意味します)、またはプログラムはアドレス指定するすべてのメモリ位置に正しいオフセットを「手動で」追加する必要がありますか。
マルチタスクに関してもう1つ質問がありますが、これは多少関連しています。実行されていないOSは、どのようにしてスレッドを停止し、次のスレッドに進みますか。これは時限割り込みで行われますか?もしそうなら、どのようにしてレジスターの値をスレッドのために保存することができますか。制御が別のスレッドに与えられる前に、それらはメモリに保存されますか?または、時限割り込みではなく、スレッドは単に制御を放棄するのに適した時間を選択しますか。時限割り込みの場合、スレッドにプロセッサ時間が与えられ、それを必要としない場合はどうなりますか。それを無駄にする必要がありますか、それは手動で割り込みを呼び出すことができますか、それとも多くの時間を必要としないことをOSに警告しますか?
編集:または、実行可能ファイルを実行する前に編集して、正しいオフセットを補正しますか?
assembly - gccインラインアセンブリでの絶対アドレス指定と相対アドレス指定
アセンブリ、特にgccインラインアセンブリでの絶対アドレス指定と相対アドレス指定の概念を理解できません。チュートリアルで次のコードを見ました:
ここで、最後の命令jmp *%%ecxは*を使用します。アスタリスクが絶対アドレス指定に使用されていることを除いて、アスタリスクの重要性についての適切な説明を見つけることができませんでした。絶対は実際の物理アドレスを意味し、相対はプログラムの開始からのオフセットを意味するという考えを私は得ています。ただし、相対的なアドレス指定については明確ではありません。アセンブリでPC相対アドレス指定について読みましたが、完全には理解しておらず、相対とPC相対が同じであるかどうかがわかりません。説明してください。