Among the most elegant implementations is the string copy function (assuming you have allocated enough memory in the dest buffer):
//Assuming for elegance you don't have to return the number of bytes copied. void strcpy(char* src, char* dest){ while(*dest++ = *src++); }
But I have often wondered what happens at the assembler such *s gets you only a single byte/character. So here is a simple program that explores this - but in string compare:
int main(){ char *a="String One", *b="String Two"; while(*a++==*b++); return 0; }
I compiled this with ‘gcc -S’ option and got the following assembly code:
.file "testpointer.c" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC0: .ascii "a\0" LC1: .ascii "b\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $16, %esp call ___main movl $LC0, 8(%esp) movl $LC1, 12(%esp) L2: movl 8(%esp), %eax movb (%eax), %dl movl 12(%esp), %eax movb (%eax), %al cmpb %al, %dl sete %al incl 8(%esp) incl 12(%esp) testb %al, %al jne L2 movl $0, %eax leave ret
Line 24: “cmpb %al, %dl” says it all. compare Lower Byte of register ‘a’ and register ’d’. Now I can be in peace ;)
References:
1. http://www.codeguru.com/cpp/cpp/cpp_mfc/tutorials/article.php/c9415
2. http://www3.itu.edu.tr/~kesgin/mul06/intel/instr/sete_setz.html
3. http://homepage.mac.com/randyhyde/webster.cs.ucr.edu/www.artofasm.com/DOS/ch09/CH09-6.html#HEADING6-83