함수 호출과 스택 구조 2 편입니다.


이번에는 함수를 한줄 한줄 넘어가면서 어떻게 스택이 생성되며

r5(프레임 포인터 레지스터, 인텔계열-ebp)

r6(스택포인터-sp, 인텔계열 - esp) 가 어떻게 변하는지 보겠습니다.



1. 먼저 main 함수가 시작될때 그림입니다.

R5 와 R6가 100으로 초기화 됩니다.

별다른 설명이 없어도 되겠죠?

아 그리고 코드 실행 위치가 1(라인) 이 됩니다.

코드실행 위치를 저장하는 레지스터가 R7(pc 라고도 합니다 program counter)입니다.

위에서는 R7 = 1 이겠군요.


R5(프레임포인터) = 100

R6(스택포인터) = 100

R7(프로그램카운터) = 1


2. main 함수 2라인 - m1 지역 변수 할당



일단 R6 가 가르키는 곳에 변수 m1를 할당합니다.

그리고 R6를 1 감소 시킵니다.


R6 = R6 -1;


R5 = 100

R6 = 99 (100 -1)

R7 = 2




3. main 함수 3라인 - m2 지역 변수 할당


또 다시 R6 가 가르키는 곳에 변수 m2를 할당합니다.

그리고 R6를 1 감소 시킵니다.


R5 = 100

R6= 98 (99 -1)

R7 = 3





4. A 함수 호출 9라인 - A함수 호출



여기가 조금 중요한 곳입니다. 일단 몇가지를 생략했다는걸 알아 주시기 바랍니다.


함수가 바뀌므로

R5를 R6가 가르키는 것으로 대입시킵니다.


R5 = R6(98) --> R5 = 98

R6 = 98

R7 = 9






5. A 함수 10라인~12 - 지역 변수 a1, a2 할당








6. A 함수 종료 1


여기서  A함수가 종료 됩니다.

R6(스택 포인터)를 R5값인 98로 바꿉니다

R6 = R5(98)


R5 = 98

R6 = R5(98) --> R6 = 98

R7 = 13




7. A 함수 종료 2



이제 main 함수 5라인으로 복귀합니다.

여기서 다시 R5 = 100으로 바꾸고

R7를 5로 바꿉니다.


R5 = 100(?)

R6 = 98

R7 = 5(?)



****** 중요

여기서 의문인점이 생깁니다.

도대체 main 함수의 스택 위치100은 어디에서 왔으며(어디에 저장되어 있나?)

다음 실행라인(pc, R7)5라인은 어디에서 왔을까요?(어디에 저장되어 있나?)

이것은 다음 게시물에서 다루겠으며 어디에 저장할지 추측해 보세요.



7. 지역 변수 m1 에 값 1을 대입하기



이제 R5(프레임 포인터)는 도대체 언제 쓰이는지 알아 볼 단계가 왔습니다.


지역 변수 m1에 1을 할당하려고 합니다.


m1 = 1;


그러면 m1 주소인 100번지에 값을 1을 넣으면 되겠지요.

하지만 위의 main() 함수니까 그나마 주소값이 고정 되어 있을지도 모르지만

A() 함수 값은 함수는 main()에 호출할수도 있고 또한 여기에 없는 또다른 함수에서 호출 할수도 있습니다. 여기서는 2번째에 호출되었지만 3, 4번째로 호출 할수 있으므로 주소가 수시로 바뀔수 있습니다.


그래서 지역변수를 접근할때  R5(프레임 포인터)가 사용됩니다.

R6(스택 포인터)는 값을 넣을때마다 수시로 변경이 되기 때문에

해당 함수가 끝나기 전까지 바뀌지 않는 R5를 사용하게 됩니다.


변수 m1는 100번지이지만

R5로 만들어 보면 R5 - 0(100-0) 값이 됩니다.

이런식으로 m2도 R5 - 1(100-1) 99가 됩니다.


그러므로 C언어로 한다면

m1 = 1; 은

(int*)(R5 - 0) = 1; --> (int*)(100) = 1;


m2 = 2; 는

(int*)(R5 - 1) = 2; --> (int*)(99) = 2;


또한 함수가 종료 될때 R6(스택 포인터)를 초기화 할때도 쓰입니다.(6. A 함수 종료 1 참고)


지역 변수는 해당 함수가 실행될때만 살아 있으므로 이는 R5를 사용하기에 알맞습니다.



그럼 다음 게시물에서  위에 빨간 글씨로 쓰인 뜻을 알아 보도록 하겠습니다.





마지막으로  지금까지의 강좌 gif 이미지



함수 호출과 이로 인해 생기는 스택 구조에 대해 간략 적으로 설명해 보겠습니다.

정말 간략적이기 때문에 상당 부분을 생략했습니다.(리턴 주소, 함수 매개변수, 환경프레임 주소 저장 등등... 생락)

다음 게시글에서 좀더 자세한 설명을 추가 할테니 일단은 개념 정도만 설명하도록 하겠습니다.


일단 C언어스택 부터 보시겠습니다.






간단합니다. main 함수 A 함수 달랑 두개가 있습니다.

그 안에 지역변수각각 2개씩 들어 있습니다.

그럼 처음 스택 구조를 보겠습니다.



스택은 데이터가 추가 되면 위에서 아래로 추가 됩니다.

옆에 있는 주소는 그냥 임의로 추가 하였고

원래는 2(16비트), 4(32비트) 단위로 감소 해야 하지만 편의를 위하여 간략하게 만들었습니다.



그럼 여기서 C언어에서 12라인까지 실행되면 스택 구조가 어떻게 되는지 대략적으로 그려보겠습니다.







대략 위와 같은 그림이 됩니다.

12라인을 실행할때 main()의 지역 변수 2개와 A()의 지역 변수 두개가 스택에 각각 위치합니다.

프로그램 수업이나 책에 보면 지역 변수는 스택에 저장 된다고 배우시잖아요.

저 그림이 그것입니다.


옆에 보시면 main()함수 구역 스택과 A()함수 스택 구조가 나뉘어있습니다.(논리적으로)

이 나뉜 부분이 unix v6책 에서 r5레지스터 환경 프레임을 가르킨다고 했는데

저 함수 구역이 환경 프레임이라고 보시면 됩니다.


그리고 하늘색으로 표시된 화살표가 다음에 스택에 데이터를 집어 넣을 장소를 가르키며

unix v6책 에서는 r6레지스터(sp - 스택 포인터 레지스터)가

저곳을 가르키는 주소(위 그림에서 주소 96)를 가지고 있습니다.

만약 스택에 데이터가 추가 되면 r6 레지스터 값이 하나가 감소(r6 = r6 - 1) 하는것이죠


그리고 주황색 화살표를 보시면 현재 함수 시작위치를 가르키고 있는데

이것이 바로 r5레지스터(인텔계열은 ebp 레지스터)가 가지고 있는 주소 값(위 그림에서 주소98)입니다.


main함수가 실행 중이면 r5 레지스터는 주소 100을 가지고 있고

A함수가 실행중이면 r5레지스터는 98를 가지고 있습니다.


다음 게시물에서는 main 함수 라인별로 따라가며 해보도록하겠습니다.


함수 호출과 스택 구조 2

http://fehead.tistory.com/200


yaourt -S freshplayerplugin-git


freshplayerplugin-git 를 추가로 깔아 쓰면 된다.



https://github.com/i-rinat/freshplayerplugin

현재 Django LTS 버전인 1.4.x 버전 기반용 소스이다.


단 책 뒷(feed)부분은 되지 않는다.


장고를 다운로드 받을때 장고 사이트를 가서 Download --> Django 1.4.X(LTS) 를 다운로드 받아야 한다.


버전이 틀리면 제대로 되지 않을 가능성 100% 이니 꼭 버전을 맞춰주자..



System Requirements
    python 2.7.x
    django 1.4.x

HOW TO RUN
    ./manage.py runserver

DB USER INFOMATION.
    id : test
    password : 11112222






django_bookmarks_1.4.x.7z


로지텍 G100 마우스를 사서 회사에서도 쓰고 집에서도 쓰고 있다


근데 둘다 가운데 버튼이 더블 클릭되는 현상이 생기고 있다

그래서 분해를 해보기로 했다.


일단 위에서 본모습 이다.






아래는 분해를 위해 빨강 동그라미 부분을 부분적으로 뜯어 냈고 나사를 풀었다.




아래는 분해를 한 모습 윗부분에 무개를 위해 철판을 단 모습이 보인다.

빨간 동그라미 부분운 해상도 조절 버튼이다

가운데 버튼은 빨강 동그라미 바로 우측 상단에 있는 버튼이다.(동그라미를 잘못그렸네요)




아래 부분을 보면 가운데 버튼, 해상도 조절 버튼(빨간색 동그라미)과 좌우 클릭(빨간색 네모) 버튼이 다른것을 알수 있습니다.

빨간색 동그라미 부분의 버튼은 kailh회사꺼 빨간색 네모 부분은 OMRON CHINA 버튼인것을 알수 있다.




자세히 보면 중국산 OMRON 스위치인 것을 알수 있다.




몇번 손가락으로 가운데 버튼을 눌러본 결과 kailh 버튼이 내부에서 더블클릭이 되고 있다는 것을 확인했다.

젠장 마우스 버튼를 교체 해야할듯 싶다.


가격 때문에 kailh 버튼을 쓴것 같다.

정말  X 같은 스위치다..


전에 구멍을 뚫었던 ipTime N604M 공유기에 회사에 남아 있던 쿨러를 달아 줬습니다.

http://fehead.tistory.com/189


위에 뚜껑 부분에 쿨러에 맞게 커터칼로 구멍을 뚫고 

쿨러 부분과 구멍에 살짝 글루건으로 붙여서 떨어 지지 않게 했습니다.



ipTime 전원이 9V, 쿨러가 12V 용이라 그냥 달았는데 조용합니다.






사용 샷.

퇴근시에 불을 끄고 보면 화려합니다 ㅎㅎ





회사에 쓰던 iptime N604M 이 한 일, 2주일에 한번씩 이상이 생겨 분해해봤더니


환기가 전혀 안되는 것 같은 구조였다.


그래서 윗 부분을 뚫어 버렸다.




먼저 분해해서 보면 윗부분에 편의을 위해 난 구멍이 있는데 그곳에 손가락을 넣어 검은 껍데기를 위로 강하게 밀어 때어 내버리고


하얀 부분은 커터 칼로 여러번 사각으로 칼집을 내고 그 사각 안쪽에 구멍이 있는데 그곳에 롱로우즈를 넣고 비틀고

잡아 당겨서 윗부분을 사각으로 구멍을 내였다.


안쪽에 방열판이 보이는데 나중에 한참 작동중인 공유기 방열판을 손가락으로 만져 봤더니 따뜻한 것이 느껴졌다.




전혀 방열이 안된 상태라면 충분히 이상이 생길 것 같은 온도였다.






현재 잘 돌아가고 있고 나중에 심심하면 위에 쿨링 팬을 달아볼 예정이다


개조 2탄 - 쿨링팬 달기 


http://fehead.tistory.com/190



제어판 --> 관리도구 -->로컬 보안정책 --> 소프트워어 제한 정책 --> 추가규칙 -->


cp949(euckr) 로 인코딩 파일명을 utf-8 변경하기 


아래 명령으로 하위 디렉토리에 있는 모든 파일을 변경해 준다.


convmv -r -f cp949 -t utf8 --notest target_dir

 


윈도우 7를 깔면 언제나 grub나 syslinux를 쓰지 못하도록 만들어버리는데..


archlinux에서 복구 할려면 상당히 간단히 할수있다.


1. 일단 arch linux CD로 부팅한다음에


2. 리눅스 파티션을 mount 한후에


3. syslinux-install_update 명령을 아래와 같이 쳐주면 된다.



# mount /dev/sda1 /mnt

# syslinux-install_update -c /mnt -iam 



+ Recent posts