For context, this is code called from a bootloader that is supposed to boot into the main application. This snippet is from a function with an argument uintptr_t address
that specifies the address of where the main application has been written to. I believe sp
and pc
are the stack pointer and program counter respectively.
Here's the code:
sp = *((void **)address + 0);
pc = *((void **)address + 1);
start_new_application(sp, pc);
Full context here
And then I've gone and printed the address, sp, and pc, and found the following:
address -> 0x08010000
sp ------> 0x20050000
pc ------> 0x080132DD
This has me very confused. I'm not sure why the sp
line has a + 0
in it at all. Could that sp
line be rewritten as:
sp = (void *)address;
and do the same thing?
My understanding is that the address has been static_casted into a double void pointer and then sp
is given the dereferenced value of address (0x08010000) and pc
has been given the dereferenced value of the address (0x08010001). Then, in my printf statements these values displayed are the dereferenced values of those addresses.
Is my understanding correct here?
The + 0
is there merely for readability.
sp = *((void **)address + 0);
pc = *((void **)address + 1);
does the same as
sp = *((void **)address);
pc = *((void **)address + 1);
or using C++ casts and the subscript operator:
sp = reinterpret_cast<void**>(address)[0];
pc = reinterpret_cast<void**>(address)[1];
Could that
sp
line be rewritten as:
sp = (void *)address;
No, that would make sp
equal to address
which is not what the original code does. The orignal code extracts a void*
from the address pointed to: *address
.