위 사이트를 보고, 아래와 같이 만들었다. gcc 에서는 그래야 하고, VC 에선 다른 것 같다. 집에서 해봐야 할 듯.
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
static inline char * my_strcpy(char * dest,const char *src);
int main(void) {
char *inner[100], *in2[100];
scanf("%s",&in2);
my_strcpy(inner, &in2);
printf("in2에 입력받은 %s를 inner에 저장 함.%d", inner,strlen(&in2));
}
static inline char * my_strcpy(char * dest, const char *src)
{
int d0, d1, d2;
__asm__ __volatile__( "1:nt"
"lodsbnt"
"stosbnt"
"testb %%al,%%alnt"
"jne 1b"
: "=&S" (d0), "=&D" (d1), "=&a" (d2)
: "0" (src),"1" (dest)
: "memory");
return dest;
}
vs2010 에서 한 소스이다. 7k짜리 release를 실행하려면, 2010 재배포 패키지 5M가 있어야 한다.
// strcpy.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
//
#include "stdafx.h"
char* mystrcpy(char* dest, char* scr);
int _tmain(int argc, _TCHAR* argv[])
{
char inner[100]="";
printf("test");
mystrcpy(inner, "hello");
printf("n%s",inner);
scanf("%s",&inner);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
char inner[100]="";
printf("test");
mystrcpy(inner, "hello");
printf("n%s",inner);
scanf("%s",&inner);
return 0;
}
char* mystrcpy(char* dest, char* scr){
int len=0;
int len=0;
_asm{
mov edi, scr
START:
cmp byte ptr [edi], 0x00
je END
inc len
inc edi
jmp START
END:
mov edi, dest
mov esi, scr
mov ecx, len
rep movs byte ptr [edi], byte ptr [esi]
}
return dest;
}
mov edi, scr
START:
cmp byte ptr [edi], 0x00
je END
inc len
inc edi
jmp START
END:
mov edi, dest
mov esi, scr
mov ecx, len
rep movs byte ptr [edi], byte ptr [esi]
}
return dest;
}
댓글 달기