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์ ๋ค์ด๊ฐ ์์ง๋ง, ์ง๊ธ์ ๊ทธ์ ๊ฐ์ ๋ฌธ๋ฒ์ ํ์ฉํ์ง ์๋๋ค. ํด๋น ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ๋ผ.
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?