Xref: news2.mv.net comp.os.msdos.djgpp:6324 From: korpela AT albert DOT ssl DOT berkeley DOT edu (Eric J. Korpela) Newsgroups: comp.os.msdos.djgpp Subject: Re: Inline assembly and DMA transfers. Date: 23 Jul 1996 18:54:26 GMT Organization: Cal Berkeley-- Space Sciences Lab Lines: 55 Message-ID: <4t3752$d8s@agate.berkeley.edu> References: <199607230018 DOT KAA25409 AT gbrmpa DOT gov DOT au> NNTP-Posting-Host: albert.ssl.berkeley.edu To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp In article <199607230018 DOT KAA25409 AT gbrmpa DOT gov DOT au>, Leath Muller wrote: >Basically, I learnt two simple rules to using inline which seem to simplify >the whole process: > >1) Use global variables. This allows easy access to C variables from your code. >It may not be what they teach at uni, etc, but it is required to access C >vars from asm easily... > >2) Do your own pushing and popping. I dont think a lot of people will agree >with this one - anybody? I disagree with both statements. The one rule to learn is USE THE EXTENDED ASSEMBLY FORMAT. Global variables are a bad idea. Let GCC do the pushing and poping. (Otherwise you may be pushing and poping registers you don't need to save. Check out "http://www.rt66.com/~brennan/djgpp/djgpp_asm.html" for a tutorial. You also use a global label, which is a bad idea if you plan to declare any routines as __inline__. I've rewritten your code below. #include void fill_block(char *mem_block, int value, int length) { asm (" 0: " /* never use global labels */ " movl %1, -4(%2,%0,4) decl %0 jge 0b " : /* No outputs */ : "r" (length), "r" (value), "r" (mem_block) /* inputs */ /* no clobbered registers */ ); } int main(void) { char *mem_block = (char *)malloc(200); fill_block(mem_block,0,200/4); free(mem_block); } >this code (should) fill the 200 bytes at mem_block with zeros... >Any comments on this code? :) See above. Look at the assembly output of gcc and you'll see that it doesn't save any registers (because it doesn't need to). And with -O3 specified the fill_block function is automatically inlined. Eric -- Eric Korpela | An object at rest can never be korpela AT ssl DOT berkeley DOT edu | stopped. Click here for more info.