[C++] 블록의 로컬변수 스택에서 처리되는 과정중..
#include<iostream> using namespace std; int main() { int local = 0x0F0F0F0F; int local2 = 0x0A0A0A0A; {//---------------------------------------------(1블록) int local = 0xEEEEEEEE; {//-------------------------------------(2블록) int local= 0xDDDDDDDD; {//-----------------------------(3블록) local= 0x0D0D0D0D; } local= 0x0C0C0C0C; } local= 0x0E0E0E0E; } return 0; }
위 소스를 VC6.0에서 디버킹 해봤습니다...메모리상에..
------------------------------------
0012FF70 DD DD DD DD EE EE EE EE
0012FF78 0A 0A 0A 0A 0F 0F 0F 0F
------------------------------------
0F 0F 0F 0F
0A 0A 0A 0A
EE EE EE EE
DD DD DD DD
순서로 겹치지 않게 잘 들어갑니다.
그렇다면 메모리를 지정하는 주소가 바뀌어야 하는데..
6: int local = 0x0F0F0F0F; 00401048 mov dword ptr [ebp-4],0F0F0F0Fh 7: int local2 = 0x0A0A0A0A; 0040104F mov dword ptr [ebp-8],0A0A0A0Ah 8: { 9: int local = 0xEEEEEEEE; 00401056 mov dword ptr [local],0EEEEEEEEh 10: { 11: int local= 0xDDDDDDDD; 0040105D mov dword ptr [local],0DDDDDDDDh 12: { 13: local= 0x0D0D0D0D; 00401064 mov dword ptr [local],0D0D0D0Dh 14: } 15: local= 0x0C0C0C0C; 0040106B mov dword ptr [local],0C0C0C0Ch 16: } 17: local= 0x0E0E0E0E; 00401072 mov dword ptr [local],0E0E0E0Eh 18: } 19: return 0;
disassembly 코드를 보면
ex> [local-4] 이런식으로 처리가 되어있을줄 알았습니다.
local 변수가 하나도 안바뀝니다.
00401056 mov dword ptr [local],0EEEEEEEEh
0040105D mov dword ptr [local],0DDDDDDDDh
00401064 mov dword ptr [local],0D0D0D0Dh
0040106B mov dword ptr [local],0C0C0C0Ch
00401072 mov dword ptr [local],0E0E0E0Eh
머신코드가 모두 7byte인데요..
혹시 사이에 local 을 변경 시키는 코드가 생략이 된게 아닌가 하는
생각도 듭니다.
그런데 어셈블리어 책을 봐도 머신코드 사이즈를 정확히 분석을 못하겠습니다.
저대로 진행이 되면 ..
동일한 local변수 위치에 덮어 쓰기가 되어야 하는데 어떻게 변수마다
자신의 위치를 찾아 갈 수 있는지..
설명부탁드립니다.
보시면 아시겠지만, local 이라는 이름은 안 바뀌지만디버그로 보시
보시면 아시겠지만, local 이라는 이름은 안 바뀌지만
디버그로 보시면 local 의 주소를 살펴보십시오
local 이라는 변수 명이 안 바뀐거지, 그것의 주소값이
바뀌는 걸 보실 수 있습니다. 즉, 제대로 처리가 되고
있는거죠 ^^ 고운 하루되세요.
=========================
CharSyam ^^ --- 고운 하루
=========================
답변감사합니다..
정말 죄송합니다...
제가 잘 못 찾는것인지..
왼쪽 아래에 로컬변수 나오는 부분 말씀하신건가요?
로컬변수들이 구분이 되어져서 나와있긴한데요..
disassembly 소스라는게 그것을 가지고 어셈블러로 컴파일해서
실행하면 원래의 소스와 동일하게 동작해야 하는것 아닌가요?
그렇게 생각하고서 보면
이렇게 연속으로 이어지는 코드 사이에서
LEA AX,local
ADD [AX],04h
이렇게 local 변수값을 바꿔주는 코드가
들어가야 하는게 아닌가 해서요...
답변부탁드립니다.
Re: 답변감사합니다..
VC6이 아닌 다른 디버거를 사용해서 디스어셈블 하시면 어떻게 다른 지 알 수 있을 것입니다. (VC6에서도 릴리즈 모드로 하면 소스 코드 안 나오던가... 가물가물) local은 디스어셈블 결과를 편하게 볼 수 있도록 쓰여진 것이지 실제로 local이라는 레지스터(나 그런 이름이 붙은 메모리 등등)가 있는 건 아닙니다.
- 토끼군
답변감사합니다..
다른 disassembler 프로그램을 찾아서 실행해본 결과
정상적으로 나옵니다..
VC6.0은 역어셈블 코드를 너무 pseudo 코드처럼 한게 아닌가..
싶네요..
댓글 달기