D ASM. Program fails

userABCabc123 via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Jan 22 09:12:25 PST 2016


On Friday, 22 January 2016 at 14:06:42 UTC, Adam D. Ruppe wrote:
> On Friday, 22 January 2016 at 12:18:53 UTC, anonymous wrote:
>> I don't know much about these things, but it seems to be the 
>> `ret;`.
>
> Right. This is an ordinary D function so the compiler generates 
> code to set up a stack for local variables. It looks like:
>
> push ebp;
> mov ebp, esp;
> sub EBP, some_size;
> /* sometimes a few other register saves */
>
> /*
>    your code here
> */
>
> /* sometimes a few other register restores */
> leave;
> ret;
>
>
> `leave` btw is the same as `mov esp,ebp; pop ebp;` - it undoes 
> the result of those first three instructions.
>
>
> All this setup stuff is about creating a stack frame for the 
> function's local variables. If you ret without restoring the 
> frame, all local variables (and return addresses!) from there 
> on are going to be out of sync and will lead to memory access 
> violations. That's what happened to you.
>
>
> If you want to write a whole function in assembly without the 
> compiler inserting any additional code, start it off with `asm 
> { naked; }` inside so dmd knows what you are trying to do. Then 
> you are in complete control.
>
> Otherwise, remember to clear the frame correctly, or better 
> yet, just return using the ordinary D statement instead of the 
> asm instruction.

naked version:

int pmovmskb2(byte16 v)
{
     asm
     {
         naked;
         push RBP;
         mov RBP, RSP;
         sub RSP, 0x20;
         movdqa dword ptr[RBP-0x10], XMM0;
         mov dword ptr[RBP-0x18], 0;
         movdqa XMM0, dword ptr[RBP-0x10];
         pmovmskb EAX, XMM0;
         mov RSP, RBP;
         pop RBP;
         ret;
     }
}

Note that there is maybe a DMD codegen bug because the asm 
generated for the non naked version copy the result to the stack 
and then the stack to result but after pmovmskb it's already 
setup in EAX.

000000000044C580h  push rbp
000000000044C581h  mov rbp, rsp
000000000044C584h  sub rsp, 20h
000000000044C588h  movdqa dqword ptr [rbp-10h], xmm0
000000000044C58Dh  mov dword ptr [rbp-18h], 00000000h
000000000044C594h  movdqa xmm0, dqword ptr [rbp-10h]
000000000044C599h  pmovmskb eax, xmm0 ; already in result
000000000044C59Dh  mov dword ptr [rbp-18h], eax ; what?
000000000044C5A0h  mov eax, dword ptr [rbp-18h] ; what?
000000000044C5A3h  mov rsp, rbp
000000000044C5A6h  pop rbp
000000000044C5A7h  ret



More information about the Digitalmars-d-learn mailing list