3

对于上下文,这是从应该引导到主应用程序的引导加载程序调用的代码。此片段来自一个函数,该函数带有一个参数,该参数uintptr_t address指定了主应用程序的写入地址。我相信sppc分别是堆栈指针和程序计数器。

这是代码:

sp = *((void **)address + 0);
pc = *((void **)address + 1);
start_new_application(sp, pc);

完整的上下文在这里

然后我去打印了地址、sp和pc,发现如下:

address -> 0x08010000
sp ------> 0x20050000
pc ------> 0x080132DD

这让我很困惑。我不确定为什么这sp条线有一个+ 0。该sp行是否可以重写为:

sp = (void *)address;

并做同样的事情?

我的理解是该地址已被静态转换为双空指针,然后sp被赋予地址的取消引用值(0x08010000),pc并被赋予地址的取消引用值(0x08010001)。然后,在我的 printf 语句中,显示的这些值是这些地址的取消引用值。

我的理解在这里正确吗?

4

1 回答 1

13

+ 0只是为了可读性。

sp = *((void **)address + 0);
pc = *((void **)address + 1);

sp = *((void **)address);
pc = *((void **)address + 1);

或使用 C++ 强制转换和下标运算符:

sp = reinterpret_cast<void**>(address)[0];
pc = reinterpret_cast<void**>(address)[1];

sp行是否可以重写为:

sp = (void *)address;

不,这将sp等于address原始代码所做的不是。原始代码void*从指向的地址中提取一个:*address

于 2019-08-07T05:54:18.053 回答