~cpp
char t[] = "1234";
char *p = "5678";
char k[] = "123456";
.LC1:
.string "5678"
.LC0:
.string "1234"
.LC2:
.string "123456";
// char t[] = "1234";
movl .LC0, %eax
movl %eax, -9(%ebp)
movb .LC0+4, %al
movb %al, -5(%ebp)
// char *p = "5678";
movl $.LC1, -4(%ebp)
// char k[] = "123456";
leal -19(%ebp), %edi
movl $.LC0, %esi
cld
movl $7, %ecx
rep
movsb
// 마지막 k변수는 index 주소를 사용해 메모리를 ëª©ì‚¬í•˜ê³ ìžˆë‹¤.
// ê·¸ë ‡ë‹¤ë©´ index로 메모리를 복사하는 것ì�€ eax로 복사하는 것보다 ëŠ�리다는 얘긴가?
사람들ì�´ 엉뚱하게 ìƒ�ê°�하는 가장 ì‰½ê³ ë�„ ì–´ë ¤ìš´ ë¬¸ì œ?
위� 경우 t는 조작 가능하지만 p는 조작 가능하지 않다.
왜ëƒ�하면 프로그램ì�˜ ëª¨ë“ ê²ƒì�€ 메모리로 올ë�¼ê°„다. 즉, LC0, LC1ì�€ 프로그램ì�˜ ì�¼ë¶€ë¡œ ë�°ì�´í„° ì˜�ì—ì—� 올ë�¼ê°„다.
í�¬ì�¸í„°ëŠ” LC1ì�„ 가리키므로 메모리ì—� ì˜¬ë ¤ì§„ 변하면 안ë�˜ëŠ” 프로그램ì˜�ì—(CODE ì˜�ì—)ì�„ 가리킨다.
하지만 ë°°ì—´(LC0)ì�€ 프로그램ì�´ 수행 ë�˜ê³ ì •ì�˜ 부분ì�´ ë�˜ëŠ” 순간 LC0 ì˜�ì—ì�˜ ë�°ì�´í„°ë¥¼ 스íƒ� ì˜�ì—ì—� 복사한다.
즉, ë°°ì—´ì�€ CODE ì˜�ì—ì�˜ í�¬ì�¸í„°ì™€ 달리 스íƒ�ì˜�ì—ì—� 존재하게 ë�˜ë¯€ë¡œ ìˆ˜ì •ì�´ 가능하게 ë�˜ëŠ” 것ì�´ë‹¤.
왜ëƒ�하면 프로그램ì�˜ ëª¨ë“ ê²ƒì�€ 메모리로 올ë�¼ê°„다. 즉, LC0, LC1ì�€ 프로그램ì�˜ ì�¼ë¶€ë¡œ ë�°ì�´í„° ì˜�ì—ì—� 올ë�¼ê°„다.
í�¬ì�¸í„°ëŠ” LC1ì�„ 가리키므로 메모리ì—� ì˜¬ë ¤ì§„ 변하면 안ë�˜ëŠ” 프로그램ì˜�ì—(CODE ì˜�ì—)ì�„ 가리킨다.
하지만 ë°°ì—´(LC0)ì�€ 프로그램ì�´ 수행 ë�˜ê³ ì •ì�˜ 부분ì�´ ë�˜ëŠ” 순간 LC0 ì˜�ì—ì�˜ ë�°ì�´í„°ë¥¼ 스íƒ� ì˜�ì—ì—� 복사한다.
즉, ë°°ì—´ì�€ CODE ì˜�ì—ì�˜ í�¬ì�¸í„°ì™€ 달리 스íƒ�ì˜�ì—ì—� 존재하게 ë�˜ë¯€ë¡œ ìˆ˜ì •ì�´ 가능하게 ë�˜ëŠ” 것ì�´ë‹¤.










