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];
}
----

Reply via email to