アセンブラ/cの質問があります。セグメントプレフィックスについて読んだばかりです。たとえば、ds:varXなどです。プレフィックスは、論理アドレスの計算に重要です。私も読みましたが、そのデフォルトは「ds」であり、ebpレジスタを使用してアドレスを計算するとすぐに「ss」が使用されます。コードの場合、「cs」がデフォルトです。それはすべて理にかなっています。今、私はcに次のものを持っています:
int x; // some static var in ds
void test(int *p){
...
*p =5;
}
... main(){
test(&x);
//now x is 5
}
ここでtest-functionの実装について考えると、スタック上のxへのポインターを取得します。ポインターを逆参照する場合は、最初にスタックからポインター値(xのアドレス)を取得し、たとえばeaxに保存します。次に、eaxを逆参照して、xの値を変更できます。しかし、c-compilerは、指定されたポインター(アドレス)がスタック上のメモリを参照しているかどうか(たとえば、別の関数からtestを呼び出し、テストのパラメーターとしてローカル変数のアドレスをプッシュした場合)またはデータセグメントをどのように認識しますか?完全な論理アドレスはどのように計算されますか?関数は、指定されたアドレスオフセットがどのセグメントに関連しているかを知ることができません。