Re: asm code and an inout function argument

2009-05-15 Thread Denis Koroskin
On Fri, 15 May 2009 19:11:55 +0400, Jesse Phillips  
wrote:

> On Fri, 15 May 2009 07:14:50 -0400, Vladimir A. Reznichenko wrote:
>
>> It looks like "inout/ref uint a" is equal to "uint* a" but the situation
>> when we write D's code "a = 5" means "*a = 5". This is not obvious, at
>> all. So when I wrote asm code, it wouldn't work.
>
> Isn't that the point of a reference, that you don't have to dereference
> it? In fact I believe "*a = 5" would be an error when using references.

Isn't it an error right now?


Re: asm code and an inout function argument

2009-05-15 Thread Jesse Phillips
On Fri, 15 May 2009 07:14:50 -0400, Vladimir A. Reznichenko wrote:

> It looks like "inout/ref uint a" is equal to "uint* a" but the situation
> when we write D's code "a = 5" means "*a = 5". This is not obvious, at
> all. So when I wrote asm code, it wouldn't work.

Isn't that the point of a reference, that you don't have to dereference 
it? In fact I believe "*a = 5" would be an error when using references.


Re: asm code and an inout function argument

2009-05-15 Thread Vladimir A. Reznichenko
Denis Koroskin Wrote:

> On Fri, 15 May 2009 14:41:35 +0400, Vladimir A. Reznichenko 
>  wrote:
> 
> > Denis Koroskin Wrote:
> >
> >> On Fri, 15 May 2009 14:24:16 +0400, Vladimir A. Reznichenko  
> >>  wrote:
> >>
> >> > I have a function:
> >> >
> >> > void test (inout uint a)
> >> > {
> >> >  asm
> >> >  {
> >> >  mov a, 0x25;
> >> >  }
> >> > }
> >> >
> >> > The trouble is that the function's call doesn't change the a variable.
> >> > Any ideas?
> >> >
> >>
> >> I believe your code is incorrect. This is how it should be done:
> >>
> >> import std.stdio;
> >>
> >> void test (out uint a)
> >> {
> >> asm
> >> {
> >> mov EDX, a;
> >> mov [EDX], 0x25;
> >> }
> >> }
> >>
> >> void main()
> >> {
> >> uint a = 0;
> >> test(a);
> >>
> >> writefln("0x%x", a);
> >> }
> >>
> >> Perhaps, errors like yours could be flagged at compile time? If so, an  
> >> enhancement request would be nice.
> >
> >
> > Thank you, Denis.
> 
> You are wellcome.
> 
> But I stand corrected - your original code was correct, it just didn't do 
> what you expected (I replaced inout with pointer for clarity):
> 
> void test (uint* a)
> {
> writefln("0x%x", a); // prints 0x12FE88, may differ
> asm {
> mov a, 0x25;
> }
> writefln("0x%x", a); // prints 0x25, i.e. you were modifying 'a', not '*a'
> }
> 
> The following would be correct, but it is disallowed and silently ignored:
> void test (uint* a)
> {
> asm {
> mov [a], 0x25; // no warning is issued, works as if there were no 
> brackets around a, is that correct behavior?
> }
> }

It looks like "inout/ref uint a" is equal to "uint* a" but the situation when 
we write D's code "a = 5" means "*a = 5". This is not obvious, at all. So when 
I wrote asm code, it wouldn't work.

Interesting implementation of inout arguments )
What's more interesting is that it wasn't reflected in inline asm documentation.


Re: asm code and an inout function argument

2009-05-15 Thread Denis Koroskin
On Fri, 15 May 2009 14:41:35 +0400, Vladimir A. Reznichenko 
 wrote:

> Denis Koroskin Wrote:
>
>> On Fri, 15 May 2009 14:24:16 +0400, Vladimir A. Reznichenko  
>>  wrote:
>>
>> > I have a function:
>> >
>> > void test (inout uint a)
>> > {
>> >asm
>> >{
>> >mov a, 0x25;
>> >}
>> > }
>> >
>> > The trouble is that the function's call doesn't change the a variable.
>> > Any ideas?
>> >
>>
>> I believe your code is incorrect. This is how it should be done:
>>
>> import std.stdio;
>>
>> void test (out uint a)
>> {
>> asm
>> {
>> mov EDX, a;
>> mov [EDX], 0x25;
>> }
>> }
>>
>> void main()
>> {
>> uint a = 0;
>> test(a);
>>
>> writefln("0x%x", a);
>> }
>>
>> Perhaps, errors like yours could be flagged at compile time? If so, an  
>> enhancement request would be nice.
>
>
> Thank you, Denis.

You are wellcome.

But I stand corrected - your original code was correct, it just didn't do what 
you expected (I replaced inout with pointer for clarity):

void test (uint* a)
{
writefln("0x%x", a); // prints 0x12FE88, may differ
asm {
mov a, 0x25;
}
writefln("0x%x", a); // prints 0x25, i.e. you were modifying 'a', not '*a'
}

The following would be correct, but it is disallowed and silently ignored:
void test (uint* a)
{
asm {
mov [a], 0x25; // no warning is issued, works as if there were no 
brackets around a, is that correct behavior?
}
}


Re: asm code and an inout function argument

2009-05-15 Thread Vladimir A. Reznichenko
Tim Matthews Wrote:

> On Fri, 15 May 2009 22:29:07 +1200, Robert Fraser  
>  wrote:
> 
> > Vladimir A. Reznichenko wrote:
> >> I have a function:
> >>  void test (inout uint a)
> >> {
> >>asm
> >>{
> >>mov a, 0x25;
> >>}
> >> }
> >>  The trouble is that the function's call doesn't change the a variable.
> >> Any ideas?
> >
> > Inout variables are pointers.
> 
> 
> Why is it 'inout' and not 'ref' ?

Aren't they the same? 


Re: asm code and an inout function argument

2009-05-15 Thread Vladimir A. Reznichenko
Denis Koroskin Wrote:

> On Fri, 15 May 2009 14:24:16 +0400, Vladimir A. Reznichenko 
>  wrote:
> 
> > I have a function:
> >
> > void test (inout uint a)
> > {
> > asm
> > {
> > mov a, 0x25;
> > }
> > }
> >
> > The trouble is that the function's call doesn't change the a variable.
> > Any ideas?
> >
> 
> I believe your code is incorrect. This is how it should be done:
> 
> import std.stdio;
> 
> void test (out uint a)
> {
> asm
> {
> mov EDX, a;
> mov [EDX], 0x25;
> }
> }
> 
> void main()
> {
> uint a = 0;
> test(a);
> 
> writefln("0x%x", a);
> }
> 
> Perhaps, errors like yours could be flagged at compile time? If so, an 
> enhancement request would be nice.


Thank you, Denis.


Re: asm code and an inout function argument

2009-05-15 Thread Denis Koroskin
On Fri, 15 May 2009 14:24:16 +0400, Vladimir A. Reznichenko 
 wrote:

> I have a function:
>
> void test (inout uint a)
> {
>   asm
>   {
>   mov a, 0x25;
>   }
> }
>
> The trouble is that the function's call doesn't change the a variable.
> Any ideas?
>

I believe your code is incorrect. This is how it should be done:

import std.stdio;

void test (out uint a)
{
asm
{
mov EDX, a;
mov [EDX], 0x25;
}
}

void main()
{
uint a = 0;
test(a);

writefln("0x%x", a);
}

Perhaps, errors like yours could be flagged at compile time? If so, an 
enhancement request would be nice.


Re: asm code and an inout function argument

2009-05-15 Thread Tim Matthews
On Fri, 15 May 2009 22:29:07 +1200, Robert Fraser  
 wrote:



Vladimir A. Reznichenko wrote:

I have a function:
 void test (inout uint a)
{
asm
{
mov a, 0x25;
}
}
 The trouble is that the function's call doesn't change the a variable.
Any ideas?


Inout variables are pointers.



Why is it 'inout' and not 'ref' ?


Re: asm code and an inout function argument

2009-05-15 Thread Robert Fraser

Vladimir A. Reznichenko wrote:

I have a function:

void test (inout uint a)
{
asm
{
mov a, 0x25;
}
}

The trouble is that the function's call doesn't change the a variable.
Any ideas?


Inout variables are pointers.