Appendix B. String.h inline assembly

static inline char * strcpy(char * dest,const char *src)
{
	int d0, d1;
	__asm__ __volatile__("cld\n"
		"1:\tlodsb\n\t"
		"stosb\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b"
		:"=&S"(d0),"=&D"(d1)
		: "0" (src),"1" (dest)
		:"ax");
	return dest;
}
  • Line 3: cld(clear direction flag) EFLAGS์˜ DF ํ”Œ๋ž˜๊ทธ๋ฅผ ํด๋ฆฌ์–ดํ•œ๋‹ค. DF ํ”Œ๋ž˜๊ทธ๊ฐ€ 0์ด๋ผ๋ฉด, string ์˜คํผ๋ ˆ์ด์…˜์—์„œ ์ธ๋ฑ์Šค ๋ ˆ์ง€์Šคํ„ฐ(ESI and/or EDI)๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.

  • Line 4: lods(load string) ds:esi์—์„œ 1/2/4๋ฐ”์ดํŠธ๋ฅผ AL, AX ๋˜๋Š” EAX ๋ ˆ์ง€์Šคํ„ฐ์— ๋กœ๋“œํ•œ๋‹ค. ์ฝ์€ ๋งŒํผ esi ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์ด DFํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ์ฆ๊ฐ€ ๋˜๋Š” ๊ฐ์†Œํ•œ๋‹ค.

  • Line 5: stos(store string) AL, AX ๋˜๋Š” EAX ๋ ˆ์ง€์Šคํ„ฐ์—์„œ 1/2/4 ๋ฐ”์ดํŠธ๋ฅผ es:edi/di์— storeํ•œ๋‹ค. ์ €์žฅํ•œ ๋งŒํผ edi ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์ด DFํ”Œ๋ž˜๊ทธ์— ๋”ฐ๋ผ ์ฆ๊ฐ€ ๋˜๋Š” ๊ฐ์†Œํ•œ๋‹ค.

  • Line 6~7: ์ฝ์€ ๊ฐ’(ax)๊ฐ€ NULL์ด ์•„๋‹ˆ๋ฉด 1๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

  • Line 8: ์ดํ•˜ ์ƒ๋žต

    • input: esi(dummy0), edi(dummy1)

    • output: esi(src), edi(dest)

    • clobber: ax

์›๋ณธ ์ฝ”๋“œ์—๋Š” input ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ clobber์— ๋“ค์–ด๊ฐ€ ์žˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ๊ทธ์™€ ๊ฐ™์€ ๋ฌธ๋ฒ•์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•ด๋‹น ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•˜๋ผ.

static inline char * strncpy(char * dest,const char *src,int count)
{
	int d0, d1, d2;
	__asm__ __volatile__("cld\n"
		"1:\tdecl %2\n\t"
		"js 2f\n\t"
		"lodsb\n\t"
		"stosb\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n\t"
		"rep\n\t"
		"stosb\n"
		"2:"
		:"=&S" (d0),"=&D" (d1),"=&c" (d2)
		:"0" (src), "1" (dest), "2" (count)
		:"ax");
	return dest;
}
  • Line 4~5: count์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ ์‹œํ‚จ๋‹ค. ์Œ์ˆ˜๋ผ๋ฉด, 2๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

  • Line 6~9: strcpy์˜ ๋‚ด์šฉ๊ณผ ๋™์ผ

  • Line 10~12: ๋‚จ์€ count๋งŒํผ stosb ๋ฐ˜๋ณตํ•œ๋‹ค. ์ฆ‰ count๋งŒํผ NULL์„ edi์— ๋ณต์‚ฌํ•œ๋‹ค.

static inline char * strcat(char * dest,const char * src)
{
	int d0, d1, d2, d3;
	__asm__("cld\n\t"
		"repne\n\t"
		"scasb\n\t"
		"decl %1\n"
		"1:\tlodsb\n\t"
		"stosb\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b"
		:"=&S"(d0), "=&D"(d1), "=&a"(d2), ="=&c" (d3)
		:"0" (src),"1" (dest),"2" (0),"3" (0xffffffff));
	return dest;
}
  • Line 3: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 4~6:

    • repne: zero flag๊ฐ€ 0์ผ๋•Œ ๋™์•ˆ,

    • scas(scan string) ax/al/eax๋ฅผ edi ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’๊ณผ ๋น„๊ต(cmp)ํ•˜์—ฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    • ์ฆ‰, src์˜ NULL ์œ„์น˜ ๋ฐ”๋กœ ์ „๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.

  • Line 7~10: strcpy์™€ ๋™์ผ

static inline char * strncat(char * dest,const char * src,int count)
{
	int d0, d1, d2, d3;
	__asm__("cld\n\t"
		"repne\n\t"
		"scasb\n\t"
		"decl %1\n\t"
		"movl %8,%7\n"
		"1:\tdecl %7\n\t"
		"js 2f\n\t"
		"lodsb\n\t"
		"stosb\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n"
		"2:\txorl %2,%2\n\t"
		"stosb"
		:"=&S" (d0), "=&D" (d1), "=&a" (d2), "=&c" (d3)
		:"0" (src),"1" (dest),"2" (0),"3" (0xffffffff),"g" (count)
		);
	return dest;
}
  • Line 4: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 5~7:

    • repne: zero flag๊ฐ€ 0์ผ๋•Œ ๋™์•ˆ,

    • scas(scan string) ax/al/eax๋ฅผ edi ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’๊ณผ ๋น„๊ต(cmp)ํ•˜์—ฌ ํ”Œ๋ž˜๊ทธ๋ฅผ ์„ค์ •ํ•œ๋‹ค.

    • ์ฆ‰, src์˜ NULL ์œ„์น˜ ๋ฐ”๋กœ ์ „๊นŒ์ง€ ์ด๋™ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.

  • Line 8: ecx๋ฅผ ์ธ์ž๋กœ ๋ฐ›์€ count๋กœ ์„ธํŒ…ํ•œ๋‹ค.

  • Line 9~14: ecx๋ฅผ ๊ฐ์†Œ์‹œํ‚ค๋ฉฐ 1๋ฐ”์ดํŠธ๋ฅผ ๋ณต์‚ฌํ•œ๋‹ค(esi -> edi)

static inline int strcmp(const char * cs,const char * ct)
{
	int d0, d1;
	register int __res __asm__("ax");
	__asm__("cld\n"
		"1:\tlodsb\n\t"
		"scasb\n\t"
		"jne 2f\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n\t"
		"xorl %%eax,%%eax\n\t"
		"jmp 3f\n"
		"2:\tmovl $1,%%eax\n\t"
		"jl 3f\n\t"
		"negl %%eax\n"
		"3:"
		:"=a" (__res, "=&D" (d0),"=&S" (d1)
		:"1" (cs), "2" (ct));
	return __res;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6~7: ds:esi์—์„œ 1๋ฐ”์ดํŠธ๋ฅผ ax์— ๋กœ๋“œํ•˜๊ณ  es:edi์˜ ๊ฐ’๊ณผ cmpํ•œ๋‹ค.

  • Line 8: ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด 2๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

  • Line 9~12: ax๊ฐ€ NULL์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด 1๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค. ๋งž๋‹ค๋ฉด, eax๋ฅผ 0์œผ๋กœ ์„ธํŒ…ํ•˜๊ณ  ๋ฆฌํ„ดํ•œ๋‹ค.

  • Line 13~15: 1์„ ๋ฆฌํ„ดํ• ์ง€, 1์„ ๋ฆฌํ„ดํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

static inline int strncmp(const char * cs,const char * ct,int count)
{
	int d0, d1, d2;
	register int __res __asm__("ax");
	__asm__("cld\n"
		"1:\tdecl %6\n\t"
		"js 2f\n\t"
		"lodsb\n\t"
		"scasb\n\t"
		"jne 3f\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n"
		"2:\txorl %%eax,%%eax\n\t"
		"jmp 4f\n"
		"3:\tmovl $1,%%eax\n\t"
		"jl 4f\n\t"
		"negl %%eax\n"
		"4:"
		:"=a" (__res), "=&D" (d0), "=&S" (d1), "=&c" (d2)
		:"1" (cs),"2" (ct),"3" (count));
	return __res;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6~7: count๋ฅผ ๊ฐ์†Œํ•˜๊ณ  ์Œ์ˆ˜๋ผ๋ฉด 2๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

  • Line 8~9: ds:esi์—์„œ 1๋ฐ”์ดํŠธ๋ฅผ ax์— ๋กœ๋“œํ•˜๊ณ  es:edi์˜ ๊ฐ’๊ณผ cmpํ•œ๋‹ค.

  • Line 10: ๊ฐ™์ง€ ์•Š๋‹ค๋ฉด 3๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

  • Line 11~14: ax๊ฐ€ NULL์ธ์ง€ ํ™•์ธํ•œ๋‹ค. ์•„๋‹ˆ๋ผ๋ฉด 1๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค. ๋งž๋‹ค๋ฉด, eax๋ฅผ 0์œผ๋กœ ์„ธํŒ…ํ•˜๊ณ  ๋ฆฌํ„ดํ•œ๋‹ค.

  • Line 15~17: 1์„ ๋ฆฌํ„ดํ• ์ง€, 1์„ ๋ฆฌํ„ดํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

static inline char * strchr(const char * s,char c)
{
	int d0;
	register char * __res __asm__("ax");
	__asm__("cld\n\t"
		"movb %%al,%%ah\n"
		"1:\tlodsb\n\t"
		"cmpb %%ah,%%al\n\t"
		"je 2f\n\t"
		"testb %%al,%%al\n\t"
		"jne 1b\n\t"
		"movl $1,%1\n"
		"2:\tmovl %1,%0\n\t"
		"decl %0"
		:"=a" (__res), "=&S" (s)
		:"1" (s),"0" (c));
	return __res;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6: c๋ฅผ ah์œผ๋กœ ์ด๋™

  • Line 7~8: ds:esi๋กœ๋ถ€ํ„ฐ 1๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ , al์— ์ €์žฅํ•˜๊ณ  ah์™€ ๋น„๊ตํ•œ๋‹ค.

  • Line 9: ๋™์ผํ•˜๋ฉด 2๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

  • Line 10~11: NULL์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ 1๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

  • Line 12~14: ๋ชป์ฐพ์œผ๋ฉด 0์„ ๋ฆฌํ„ดํ•˜๊ณ , ์ฐพ์•˜๋‹ค๋ฉด ์ฐพ์€ ์ฃผ์†Œ(esi)๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

static inline char * strrchr(const char * s,char c)
{
	int d0, d1;
	register char * __res __asm__("dx");
	__asm__("cld\n\t"
		"movb %%al,%%ah\n"
		"1:\tlodsb\n\t"
		"cmpb %%ah,%%al\n\t"
		"jne 2f\n\t"
		"movl %%esi,%0\n\t"
		"decl %0\n"
		"2:\ttestb %%al,%%al\n\t"
		"jne 1b"
		:"=d" (__res), "=&S" (d0), "=&a" (d1)
		:"0" (0),"1" (s),"2" (c));
	return __res;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6: c๋ฅผ ah์œผ๋กœ ์ด๋™

  • Line 7~8: ds:esi๋กœ๋ถ€ํ„ฐ 1๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ , al์— ์ €์žฅํ•˜๊ณ  ah์™€ ๋น„๊ตํ•œ๋‹ค.

  • Line 9: ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉด 2๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

  • Line 10~11: ๋ฐœ๊ฒฌํ•œ ์ฃผ์†Œ๋ฅผ __res์— ์ €์žฅํ•œ๋‹ค.

  • Line 12~14: NULL์— ๋„๋‹ฌํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด 1๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

static inline int strspn(const char * cs, const char * ct)
{
	int d0, d1;
	register char * __res __asm__("si");
	__asm__("cld\n\t"
		"movl %6,%%edi\n\t"
		"repne\n\t"
		"scasb\n\t"
		"notl %%ecx\n\t"
		"decl %%ecx\n\t"
		"movl %%ecx,%%edx\n"
		"1:\tlodsb\n\t"
		"testb %%al,%%al\n\t"
		"je 2f\n\t"
		"movl %6,%%edi\n\t"
		"movl %%edx,%%ecx\n\t"
		"repne\n\t"
		"scasb\n\t"
		"je 1b\n"
		"2:\tdecl %0"
		:"=S" (__res), "=&a" (d0), "=&c" (d1)
		:"1" (0),"2" (0xffffffff),"0" (cs),"g" (ct)
		:"dx","di");
	return __res-cs;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6~11: ct์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜์—ฌ edx์— ์ €์žฅ.

  • Line 12~14: esi์—์„œ 1๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ  al์— ์ €์žฅ, NULL์ธ์ง€ ํ™•์ธ

  • Line 15~19: ct ์ค‘ al๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฐ”์ดํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ, ์—†๋‹ค๋ฉด ๋ฆฌํ„ดํ•œ๋‹ค.

  • Line 20: ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์žˆ๋‹ค๋ฉด(je) 1๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ€ ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•œ๋‹ค.

static inline int strcspn(const char * cs, const char * ct)
{
	int d0, d1;
	register char * __res __asm__("si");
	__asm__("cld\n\t"
		"movl %6,%%edi\n\t"
		"repne\n\t"
		"scasb\n\t"
		"notl %%ecx\n\t"
		"decl %%ecx\n\t"
		"movl %%ecx,%%edx\n"
		"1:\tlodsb\n\t"
		"testb %%al,%%al\n\t"
		"je 2f\n\t"
		"movl %6,%%edi\n\t"
		"movl %%edx,%%ecx\n\t"
		"repne\n\t"
		"scasb\n\t"
		"jne 1b\n"
		"2:\tdecl %0"
		:"=S" (__res), "=&a" (d0), "=&c" (d1)
		:"1" (0),"2" (0xffffffff),"0" (cs),"g" (ct)
		:"dx","di");
	return __res-cs;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6~11: ct์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜์—ฌ edx์— ์ €์žฅ.

  • Line 12~14: esi์—์„œ 1๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ  al์— ์ €์žฅ, NULL์ธ์ง€ ํ™•์ธ

  • Line 15~19: ct ์ค‘ al๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฐ”์ดํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ, ์žˆ๋‹ค๋ฉด ๋ฆฌํ„ดํ•œ๋‹ค.

  • Line 20: ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†๋‹ค๋ฉด(jne) 1๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ€ ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•œ๋‹ค.

static inline char * strpbrk(const char * cs,const char * ct)
{
	int d0, d1;
	register char * __res __asm__("si");
	__asm__("cld\n\t"
		"movl %6,%%edi\n\t"
		"repne\n\t"
		"scasb\n\t"
		"notl %%ecx\n\t"
		"decl %%ecx\n\t"
		"movl %%ecx,%%edx\n"
		"1:\tlodsb\n\t"
		"testb %%al,%%al\n\t"
		"je 2f\n\t"
		"movl %6,%%edi\n\t"
		"movl %%edx,%%ecx\n\t"
		"repne\n\t"
		"scasb\n\t"
		"jne 1b\n\t"
		"decl %0\n\t"
		"jmp 3f\n"
		"2:\txorl %0,%0\n"
		"3:"
		:"=S" (__res), "=&a" (d0), "=&c" (d1)
		:"1" (0),"2" (0xffffffff),"0" (cs),"g" (ct)
		:"dx","di");
	return __res;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6~11: ct์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜์—ฌ edx์— ์ €์žฅ.

  • Line 12~14: esi์—์„œ 1๋ฐ”์ดํŠธ๋ฅผ ์ฝ๊ณ  al์— ์ €์žฅ, NULL์ธ์ง€ ํ™•์ธ

  • Line 15~19: ct ์ค‘ al๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ฐ”์ดํŠธ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ, ์žˆ๋‹ค๋ฉด ์ฐพ์€ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

  • Line 20: ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž๊ฐ€ ์—†๋‹ค๋ฉด(jne) 1๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ€ ๋‹ค์Œ ๋ฌธ์ž๋ฅผ ๋น„๊ตํ•œ๋‹ค.

static inline char * strstr(const char * cs,const char * ct)
{
int d0, d1;
register char * __res __asm__("ax");
__asm__("cld\n\t" \
    "movl %6,%%edi\n\t"
    "repne\n\t"
    "scasb\n\t"
    "notl %%ecx\n\t"
    "decl %%ecx\n\t"    /* NOTE! This also sets Z if searchstring='' */
    "movl %%ecx,%%edx\n"
    "1:\tmovl %6,%%edi\n\t"
    "movl %%esi,%%eax\n\t"
    "movl %%edx,%%ecx\n\t"
    "repe\n\t"
    "cmpsb\n\t"
    "je 2f\n\t"     /* also works for empty string, see above */
    "xchgl %%eax,%%esi\n\t"
    "incl %%esi\n\t"
    "cmpb $0,-1(%%eax)\n\t"
    "jne 1b\n\t"
    "xorl %%eax,%%eax\n\t"
    "2:"
    :"=a" (__res), "=&S" (d0), "=&c" (d1)
    :"0" (0),"2" (0xffffffff),"4" (cs),"g" (ct)
    :"dx","di");
return __res;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6~11: ct์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜์—ฌ edx์— ์ €์žฅ.

  • Line 12~14: ct๋ฅผ edi์— ์„ธํŒ…, esi๋ฅผ eax์— ์„ธํŒ…, ecx์— ๊ตฌํ•œ ๊ธธ์ด๋ฅผ ์ €์žฅ.

  • Line 15~17: cs์—์„œ ct์™€ ์ผ์น˜ํ•˜๋Š” ๋ฌธ์ž์—ด์ด ์žˆ๋Š”์ง€ ํ™•์ธ, ์žˆ๋‹ค๋ฉด ์ฐพ์€ ์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

  • Line 18~22: ๋ฌธ์ž์—ด ๋์— ๋„๋‹ฌํ•˜๋ฉด, 0์„ ๋ฆฌํ„ด ์•„๋‹ˆ๋ผ๋ฉด index๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ 1๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

static inline int strlen(const char * s)
{
int d0;
register int __res __asm__("cx");
__asm__("cld\n\t"
    "repne\n\t"
    "scasb\n\t"
    "notl %0\n\t"
    "decl %0"
    :"=c" (__res),"=&D" (d0)
    :"1" (s),"a" (0),"0" (0xffffffff));
return __res;
}
  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 6~10: s์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜์—ฌ __res์— ์ €์žฅ.

Last updated