assembler copy char[]

nobody not at possible.net
Thu Jun 7 05:04:43 PDT 2007


Frits van Bommel Wrote:

> nobody wrote:
> > i try copy mystring to st in assembler. 
> > Can someone give me an advice how to do this.
> > 
> > import std.stdio;
> > void main()
> > {
> >         char[] mystring = "Hey Assembler\n";
> >         char[] st;
> > 
> >         asm
> >         {
> >                 mov EAX, dword ptr [mystring+4];
> >                 mov st,EAX;
> >         }
> >         writefln("st: ", st);
> > }
> > 
> > I get a Segmentation fault .
> 
> Unsurprising, since you're copying mystring.ptr to st.length, creating 
> an array reference to a (likely huge) array with (.ptr == null) ;).
> 
> Like Daniel, who posted while I was composing this post, I wonder why 
> you're trying to do this. There's a much easier way that can likely be 
> better optimized by the compiler.
> But if you're determined to do this (or are just trying to expand your 
> knowledge of asm coding and/or D array implementation), read on.

Yes i try to learn Inline Assembler but it is more
difficult then i thought ;-)

> 
> Assuming you're trying to code "st = mystring" in assembler, try this:
> ---
> import std.stdio;
> void main()
> {
>          char[] mystring = "Hey Assembler\n";
>          char[] st;
> 
>          asm
>          {
> 		// Copy length
>                  mov EAX, dword ptr [mystring];
>                  mov [st],EAX;
> 		
> 		// Copy ptr
>                  mov EAX, dword ptr [mystring+4];
>                  mov [st+4],EAX;
>          }
>          writefln("st: ", st);
> }
> ---
> Remember, dynamic arrays have two parts: a length and a pointer to the 
> data.

Yes i figured this out.

 You need to copy both of them (and to the corresponding part of 
> the destination, obviously) to copy a dynamic array reference.

Ah, that's the trick.
> 
> 
> 
> P.S. It'll likely be a bit more efficient to do this:
> ---
>          asm
>          {
>                  mov ECX, dword ptr [mystring];
>                  mov EDX, dword ptr [mystring+4];
>                  mov [st],ECX;
>                  mov [st+4],EDX;
> 		
>          }
> ---
> because it leaves more time between reading and writing, allowing the 
> CPU to perform better pipelining.
> About register usage: I used ECX & EDX here because (like EAX) those 
> don't need to be preserved between function calls, so the compiler 
> doesn't necessarily need to insert extra code to preserve them. I didn't 
> use EAX because that's more likely to contain a useful value due to its 
> special uses in calling conventions, and is thus more likely to require 
> extra code to be emitted to preserve it.
> 
> But better optimization would likely result from just changing it to "st 
> = mystring" and adding '-O' (or '-O3' for GDC) to the command line 
> options passed to the compiler :). (Plus it'll be platform-independent)

Wow, that's exactly what i want.
In dmd it's all ok, but the gdc  didn't like it: 

mov EDX, dword ptr [mystring+4];
mov [st+4],EDX;


gdmd  string.d
/tmp/cc4h5AKo.s: Assembler messages:
/tmp/cc4h5AKo.s:30: Error: junk `(%ebp)+4' after expression
/tmp/cc4h5AKo.s:31: Error: junk `(%ebp)+4' after expression





More information about the Digitalmars-d-learn mailing list