c,c++표현으로 불가능한가?

nayana의 이미지

Quote:
int function( int parameter )
{
int local = 3;
return 6;
}

스택에서 실행되는 순서는

1. 빈 int 자리 하나가 스택에 쌓인다.
2. parameter가 스택에 쌓인다.
3. local이 스택에 쌓인다.
4. 값 6이 반환값 자리에 들어간다.
5. local 이 뽑힌다.
6. parameter가 뽑힌다.
7. 이 함수를 호출한곳에서 스택의 최상위값, 즉 반환값을 뽑는다


스택에 실행되는 순서를 눈으로 확인할려고 하는데...생각보다 쉽지 않습니다. 프로그래밍 Q&A올렸었었는데...어셈블리어로 변형시켜서 의미를 파악했는데...^^
과연 c,c++로 표현못하나요?
나머지 제 나름대로 표현을 할수 있을것 같은데...
1, 4번이 표현하는것이 막막하네요...^^
이광우의 이미지

단순히 눈으로만 확인하고 싶으시면..
gdb를 사용해 보세요.

emacs 등과 함께 소스레벨로 디버깅하면서
해당 포인터 값과 함께 헥사 값으로 찍어서 확인해 보시면 되겠네요.

gdb 내부에서 x 명령을 사용하시면 특정지점에서 헥사값으로
프로그램 내에 어느 위치에서 부터 어디까지 내용을 찍어 볼 수 있습니다.
(help x : x/1000 memory_address )

disassemble 과 함께 사용하시면..
%eap, %ebp 등의 주소와 값이 어떻게 할당되는 지도 볼 수 있습니다.

gdb 내에서 값을 조작하고 싶은 경우에는 set 명령등을 사용해서 변경시킬 수 도 있죠.
쉘코드 등을 작성할 때 라든가..
프로그램 내의 값을 조작할 때도 사용할 수 있습니다.

참고 하시라고 적습니다.

Be Creative For Fun!!

nayana의 이미지

답변에 감사합니다.
그러면 c,c++로 표현이 불가능하다고 봐야하네요!!!
c,c++로 표현을 못하는것도 있구나^^;

버려진의 이미지

스택에 쌓인 것은 포맷 스트링으로 볼 수 있습니다.

좀 무식하지만

int function( int parameter )
{
int local = 3;
printf("%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x");
...
}

이런식으로 하시면 됩니다. ^^;; main의 argv쪽부터 나올거에요. function에 사용된 parameter나 local같은 값은 좀 뒷쪽에 나올겁니다. 보시면 아실테고...

그런데 굳이 c, c++로 해야 할 이유가 있나요?

Hyun의 이미지

촙5 wrote:
스택에 쌓인 것은 포맷 스트링으로 볼 수 있습니다.

좀 무식하지만

int function( int parameter )
{
int local = 3;
printf("%08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x %08x");
...
}

이런식으로 하시면 됩니다. ^^;; main의 argv쪽부터 나올거에요. function에 사용된 parameter나 local같은 값은 좀 뒷쪽에 나올겁니다. 보시면 아실테고...

그런데 굳이 c, c++로 해야 할 이유가 있나요?


이게... i386말구 다른 아키텍쳐에선... 어떻게 되죠??? argument넘기는 방법이 다른데선... 확인 불가능인것 같은데...
Hyun의 이미지

nayana wrote:
스택에서 실행되는 순서는

1. 빈 int 자리 하나가 스택에 쌓인다.
2. parameter가 스택에 쌓인다.
3. local이 스택에 쌓인다.
4. 값 6이 반환값 자리에 들어간다.
5. local 이 뽑힌다.
6. parameter가 뽑힌다.
7. 이 함수를 호출한곳에서 스택의 최상위값, 즉 반환값을 뽑는다

이런건... 그냥 대략 어떻게 된다... 정도까지만 알고 있으면 되지 않을까요?
어차피 아키텍처마다 방법도 틀리고(스택이 똑바로 자라는 아키텍처도 있더군요...)... 컴파일러가 다 알아서 해주니깐...
함수 호출할 때 현재 프레임포인터 스택에 들어가고... 함수내의 지역변수 스택에 잡히고... 함수 돌다가 되돌림값 특정레지스터에 넘겨져 상위함수에 되돌려지고...
이정도만 알고 있어도 충분치 않을까 합니다...
굳이 공부의 목적이 아니라면... :roll:

nayana의 이미지

굳이 c,c++해야할 이유는 없습니다.
일단 우선은 공부목적이고 제가 표현하고 싶은것을 코드로 단지 표현하고 싶어서 입니다.