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

  • Line 4~5: count์˜ ๊ฐ’์„ 1 ๊ฐ์†Œ ์‹œํ‚จ๋‹ค. ์Œ์ˆ˜๋ผ๋ฉด, 2๋ฒˆ ๋ผ๋ฒจ๋กœ ์ ํ”„ํ•œ๋‹ค.

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

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

  • Line 3: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

  • Line 4~6:

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

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

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

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

  • 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)

  • 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์„ ๋ฆฌํ„ดํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

  • 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์„ ๋ฆฌํ„ดํ• ์ง€ ๊ฒฐ์ •ํ•œ๋‹ค.

  • 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)๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

  • 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๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

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

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

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

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

  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

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

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

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

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

  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

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

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

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

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

  • 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๋ฒˆ ๋ผ๋ฒจ๋กœ ๋Œ์•„๊ฐ„๋‹ค.

  • Line 5: DF ํ”Œ๋ž˜๊ทธ ํด๋ฆฌ์–ด.

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

Last updated

Was this helpful?