U E D R , A S I H C RSS

C/Assembly/포인터와배열

~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 영역의 포인터와 달리 스택영역에 존재게 되므로 수정이 가능게 되는 것이다.
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:22:47
Processing time 0.0089 sec