Asm trouble, again. There is a function in a programm.

void test (inout uint a, uint sh, uint b)
{
        version (X86)
        {asm {
                mov EAX, a;
                mov EBX, sh;
                mov ECX, b;
                
                push EAX; //a adress saved
                
                //EAX = rotateLeft (a, sh) + b 
                push [EAX];
                push EBX;
                call rotateLeft;
                add EAX, ECX;

                pop EDX; //a adress restored
                
                mov [EDX], EAX;
        }}
}

void main ()
{
        uint a = 1;
        test (a, 5, 25);
        writeln (a);
}

When launched the executable,got this: Error: Access Violation

What's intresting, if i change asm code to
(save a address in the stack removed, forcing register values after the call 
instraction), it works just fine

        ...
        call rotateLeft;
                
        //force registers values
        mov EDX, a;
        mov ECX, b;
        ..

So the question is why the call instruction drops register values?
It have to save registers state and restore it after the rotateLeft finished 
(EAX of course will store a function call result).

Reply via email to