我有一个汇编程序/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 编译器如何知道给定的指针(地址)是否引用堆栈上的内存(例如,如果我从另一个函数调用 test 并将局部变量的地址作为测试参数推送)或数据段?如何计算完整的逻辑地址?该函数无法知道给定地址偏移量与哪个段相关..?!