| [ CnUnix ] in KIDS 글 쓴 이(By): ddaeng (김 경 철) 날 짜 (Date): 1995년07월13일(목) 05시34분17초 KDT 제 목(Title): re : 로칼 변수.. 뭐 오토클래스.. (으윽. 클래스라는 말만 들으면 무서워) .. 어쩌구는 잘 모르겠는데요. 좀 옛날 씨 랭기지로 된 프로그램을 컴파일해서 만든 바이나리가 실행될때는, 로칼변수는 분명히 스택에 들어갔어요. 적어도 68000계열의 씨 컴파일러 같은거에서는 말에요. 아마 터보씨 정도의 좀 옛날 컴파일러에서도 마찬가지고요. 68000 어셈블리중에.. 으으. 니모닉이 뭐드라.. LINK덩가? 하는게 있는데, 그게 푸레임 포인터 푸쉬하고.. 스택포인터를 로칼변수의 양만큼 증가(감소?)시키는 거여찌요. 아마 프레임포인터가 a6레지스터였지요? 스택포인터는 a7이엇고. 그 반대역할 해주는 UNLK덩가 하는 니모닉도 있었고요 그래서 펑션의 처음은 LINK로 시작하고, 끝은 UNLK와 RET로 끝났었어요. 좌간 그렇게 해서 스택에서 안쓰고 스킵한 부분을 로칼변수 영역으로 사용했는데.. 이게 항상 그러라는 보장이 없지요. 컴파일러가 어떻게 옵티마이즈를 하느냐에 따라 막 달라질수도 있구요. 요즘 기계들은 기계 자체보다 컴파일러가 얼마나 옵티마이즈를 잘 하느냐로 성능이 결정되기도 하기때문에.. 옵티마이저가 완전 state of art인디.. 한마디로, 위의 같은 경우, 콜 되는 펑션에서 콜 하는 펑션의 로칼변수를 읽는것은, 특정 기계, 특정 컴파일러, 특정 컴파일 옵션이 주어진 상황에선 가능할 것이라고 생각이 되네요. 스택을 주욱 거슬러 올라가면 되니까, 펑션에서 포인터 변수를 하나 지정하고, 거기에 자신의 어드레스를 넣고 음. 프로그램으로 쓰자면 대충.. bar() { char *p; p = &p; p -=(혹은+=) (포인터변수의 크기)+(리턴어드레스의 크기)+ (프레임포인터의 크기)+alpha; ... } -=인지 +=인지.. 하고 alpha에 해당하는건 좀 이거저거 봐야 알겠고요. 위와같이 한 다음에 타잎에따라 *((타입 *)p) 하면... 적어도 제가 아는 한도안에서는, 기계는 삼성에서 옛날에 만든 SSM16, 컴파일러는 거기 유닉스에 깔려있던 cc, 컴파일 옵션은 없이.. 이런 상황에서는 할 수 있을것 같군요. -- (김 경 철)Kim, Kyoung-chul ddaeng7@glory.kaist.ac.kr Computer System Lab. #1 +82-2-958-3385 Dept. of Infomation and Communication, KAIST, Seoul, Korea |