if i do'nt specify output operands in strcpy, will it make any differnce, following code works fine on my x86 machine: inline void nstrcpy(char *src, char *dst){ __asm__ __volatile__ ( "1: lodsb \n\t" "stosb\n\n" "testb %%al, %%al \n\t" "jne 1b" : : "S"(src) , "D" (dst) ); } please let me know if above code has some problem Thanx PC --- Momchil Velikov <velco@xxxxxxxxx> wrote: > Vijay Subramanian wrote: > > On 18/01/06, Rajaram Suryanarayanan > <rajaram_linux@xxxxxxxxx> wrote: > >> Can anybody pls explain me step by step what is > done by the assembly code > >>below ? Particularly, I want to know how "src" and > "dest" get substituted in > >>the assembly code. > >> > >> static inline char * strcpy(char * dest,const > char *src) > >> { > >> int d0, d1, d2; > >> __asm__ __volatile__( > >> "1:\tlodsb\n\t" > >> "stosb\n\t" > >> "testb %%al,%%al\n\t" > >> "jne 1b" > >> : "=&S" (d0), "=&D" (d1), "=&a" (d2) > >> :"0" (src),"1" (dest) : "memory"); > >> return dest; > >> } > > I am not sure why we need d0, d1 and d2. Can > anyone give a hint? Thanks. > > The insn takes an input esi and edi and produces > output in (i.e. modifies) esi, > edi, eax and memory. > > Thus we have to specify that inputs must be copied > to esi and edi > > : <outputs> > : "S" (src), "D" (dst) > : <clobbers> > > then specify that the insn modifies ESI and EDI > > : "=S" (<var>), "=D (<var>)" > : "S" (src), "D" (dst) > : <clobbers> > > but this is invalid, because it tells GCC to > allocate two registers from the > each of S and D classes, but both contain a single > register, moreover the insn > in fact modifies its inputs, hence we must tell that > corresponding inputs and > outputs are in fact in the same register [1]: > > : "=S" (<var>), "=D" (<var>) > : "0" (src), "1" (dst) > : <clobbers> > > Now we have to tell where the outputs to go. As we > are not really interested in > the values of the ESI and EDI, we can specify > arbitrary temporary variables. > Note that we can't use the variables ``src'' and > ``dest'' we already have [2], > because the compiler will copy ESI and EDI to them > and we do not want it for > ```dest''. Thus: > > : "=S" (tmp0), "=D" (tmp1) > : "0" (src), "1" (dst) > : <clobbers> > > and finally > > : "=S" (tmp0), "=D" (tmp1), "=a" (tmp2) > : "0" (src), "1" (dst) > : "memory" > > Note that in this particular case there's no need > for the ``&'' constraint. It > prevents the same register from being allocated both > for input and an output > operand, but in this case we explictly assign > concrete registers, so this cannot > happen. > > ~velco > > [1] Note that this could theoretically expressed > also as: > > : "=2" (<var>), "=3" (<var>) > : "S" (src), "S" (dst) > : <clobbers> > > but this is INVALID as gcc allows number constraints > only on input operands. > > [2] well, we can use ``src'', because it is dead > after the insn > > -- > Kernelnewbies: Help each other learn about the Linux > kernel. > Archive: > http://mail.nl.linux.org/kernelnewbies/ > FAQ: http://kernelnewbies.org/faq/ > > Vision without action is merely a dream, action without vision is wastage of time, vision and action together can change the world .... Send instant messages to your online friends http://in.messenger.yahoo.com -- Kernelnewbies: Help each other learn about the Linux kernel. Archive: http://mail.nl.linux.org/kernelnewbies/ FAQ: http://kernelnewbies.org/faq/