MASM의 어셈블 코드를
VisualStudio에서 들여다 보는것 처럼 드래그하면 되는걸로 쉽게 생각했지만 그게 아니었다. VS를 너무 호락호락하게 본것 같다. 불가능 한것은 아니어 보이는데 쉬워보이지는 않는다.
그렇다면
i++VS++i에서 최적화된 i++ 어셈블 코드에 관한 이야기, 연산자 오버로딩에 있어서 후치연산자++ 의 용도에 관한 이야기들은 어떻게 해서 나오게 된것인지 궁금합니다.
.exe파일의 어셈블 코드부분에 대한 질문.
지식in(http://zeropage.org/wiki/AsemblC_2b_2b?action=edit)
i++VS++i를 시작한 사람이 접니다^^ 그걸 보고 관심을 갖는 사람이 있다니 반갑군요~ 혹시 누구신지요? --
상규
이해를 돕기 위해
i++VS++i에서 i++ 등의 어셈블리 코드를 어떻게 얻었는지를 설명해 드리겠습니다.
결론부터 말을 하자면 .exe 파일에서 어셈블리 코드를 얻어낸 것이 아닙니다. 물론 그것도 가능하지만 매우 어렵죠.
그렇다면 다른 방법이 있다는 건데... 바로 컴파일러에 어셈블리 코드를 얻어내는 기능이 있습니다.
요즘 컴파일러들은 컴파일을 하면 오브젝트 파일(.obj)을 생성합니다. 이것은 소스를 해석해서 만들어낸 기계어 코드입니다.
하지만 컴파일을 할 때 옵션을 붙여 오브젝트 파일 뿐 아니라 어셈블리 코드도 생성할 수도 있습니다.
어셈블리 코드는 기계어와 거의 같다고 봐도 무방하기 때문에 컴파일러의 출력 형식의 차이 정도라고 보시면 되겠습니다.
(생성된 어셈블리 코드를 어셈블러에 넣으면 오브젝트 파일이 나오게 됩니다.)
이렇게 얻은 어셈블리 코드는 모든 최적화 과정이 끝난 상태이기 때문에 .exe 파일로 만들어질 때 까지 변형되지 않습니다.
그렇기 때문에 굳이 어려운 방법을 통해 .exe 파일에서 어셈블리 코드를 얻어낼 필요가 없는 것이죠. --
상규
MS의 C/C++ 컴파일러에서 어셈블리 코드를 얻는 옵션은 /FA 입니다.
이 옵션을 붙여 컴파일을 하면 .obj 파일 뿐 아니라 .asm 파일도 만들어집니다.
C/C++ 코드와 해당되는 어셈블리 코드를 비교하며 보고 싶다면
/FAs 옵션을 붙여보세요.
차이점은 설명하기가 귀찮네요-_-; 직접 해보시고 차이점을 알아보시길... --
상규