[C++] 블록의 로컬변수 스택에서 처리되는 과정중..

gyxor의 이미지

#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변수 위치에 덮어 쓰기가 되어야 하는데 어떻게 변수마다
자신의 위치를 찾아 갈 수 있는지..
설명부탁드립니다.

charsyam의 이미지

보시면 아시겠지만, local 이라는 이름은 안 바뀌지만
디버그로 보시면 local 의 주소를 살펴보십시오
local 이라는 변수 명이 안 바뀐거지, 그것의 주소값이
바뀌는 걸 보실 수 있습니다. 즉, 제대로 처리가 되고
있는거죠 ^^ 고운 하루되세요.

=========================
CharSyam ^^ --- 고운 하루
=========================

gyxor의 이미지

정말 죄송합니다...
제가 잘 못 찾는것인지..
왼쪽 아래에 로컬변수 나오는 부분 말씀하신건가요?
로컬변수들이 구분이 되어져서 나와있긴한데요..
disassembly 소스라는게 그것을 가지고 어셈블러로 컴파일해서
실행하면 원래의 소스와 동일하게 동작해야 하는것 아닌가요?
그렇게 생각하고서 보면

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 

이렇게 연속으로 이어지는 코드 사이에서
LEA AX,local
ADD [AX],04h
이렇게 local 변수값을 바꿔주는 코드가
들어가야 하는게 아닌가 해서요...
답변부탁드립니다.
lifthrasiir의 이미지

gyxor wrote:
정말 죄송합니다...
제가 잘 못 찾는것인지..
왼쪽 아래에 로컬변수 나오는 부분 말씀하신건가요?
로컬변수들이 구분이 되어져서 나와있긴한데요..
disassembly 소스라는게 그것을 가지고 어셈블러로 컴파일해서
실행하면 원래의 소스와 동일하게 동작해야 하는것 아닌가요?
그렇게 생각하고서 보면
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 

이렇게 연속으로 이어지는 코드 사이에서
LEA AX,local
ADD [AX],04h
이렇게 local 변수값을 바꿔주는 코드가
들어가야 하는게 아닌가 해서요...
답변부탁드립니다.

VC6이 아닌 다른 디버거를 사용해서 디스어셈블 하시면 어떻게 다른 지 알 수 있을 것입니다. (VC6에서도 릴리즈 모드로 하면 소스 코드 안 나오던가... 가물가물) local은 디스어셈블 결과를 편하게 볼 수 있도록 쓰여진 것이지 실제로 local이라는 레지스터(나 그런 이름이 붙은 메모리 등등)가 있는 건 아닙니다.

- 토끼군

gyxor의 이미지

다른 disassembler 프로그램을 찾아서 실행해본 결과

:00401048 C745FC0F0F0F0F          mov dword[ebp-04], 0F0F0F0F
:0040104F C745F80A0A0A0A          mov dword[ebp-08], 0A0A0A0A
:00401056 C745F4EEEEEEEE          mov dword[ebp-0C], EEEEEEEE
:0040105D C745F0DDDDDDDD          mov dword[ebp-10], DDDDDDDD
:00401064 C745F00D0D0D0D          mov dword[ebp-10], 0D0D0D0D
:0040106B C745F00C0C0C0C          mov dword[ebp-10], 0C0C0C0C
:00401072 C745F40E0E0E0E          mov dword[ebp-0C], 0E0E0E0E

정상적으로 나옵니다..

VC6.0은 역어셈블 코드를 너무 pseudo 코드처럼 한게 아닌가..
싶네요..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.