【发布时间】:2011-06-19 11:37:41
【问题描述】:
我有一个汇编程序/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 并将局部变量的地址作为测试参数推送)或数据段?如何计算完整的逻辑地址?该函数无法知道给定地址偏移量与哪个段相关..?!
【问题讨论】:
-
下次你可能想读一本 1990 年以后出版的书... ;-)