On 07/08/2018 10:27 PM, Stijn Herreman wrote:
https://forum.dlang.org/thread/ddckhvcxlyuvuiyaz...@forum.dlang.org is
similar to what I want to do, but the code by Adam cannot be used when
using Better C (I assume slicing isn't supported).
Slicing a pointer works fine for me with -betterC (DMD 2.081.0). Why do
you think it doesn't work?
I have the following code:
environment.d
public __gshared header* GPT_header;
public __gshared partition_entry[128] GPT_entries;
main.d
GPT_header = cast(header*)0x00007e00;
*(GPT_entries).ptr = *(cast(partition_entry*)0x00008000);
Disassembled, the code from main.d looks like this:
mov ds:_D4boot11environment10GPT_headerPSQBg3gpt6header, 7E00h
mov esi, 8000h
mov edi, offset
_D4boot11environment11GPT_entriesG128SQBk3gpt15partition_entry
mov ecx, 20h
rep movsd
So GPT_header points to 0x7e00 as desired, but for GPT_entries it copies
the first array element to a different location and makes it point to
that location instead of 0x8000.
As far as I can tell, the assembler code does exactly what your D code
says: Copy one partition_entry (size is apparently 128 bytes?) from
0x8000 to GPT_entries[0].
If you want to set the .ptr of GPT_entries explicitly, I don't know if
that's possible. But the code you have is not how you'd do it. You're
dereferencing GPT_entries.ptr, you're not setting it.
You can get a partition_entry[] that starts at 0x8000 by casting a
pointer and slicing that. Works for me with -betterC:
----
struct partition_entry {}
public __gshared partition_entry[] GPT_entries;
extern(C) void main()
{
GPT_entries = (cast(partition_entry*) 0x8000)[0 .. 128];
}
----