2010-12-01 3 views
8

C 또는 C++와 같은 상위 언어의 디스 어셈블리를 이해하는 것이 유용 할 때가 있습니다. 어셈블리에서 책을 읽는 것은 분명히 컴파일러 출력을 이해하는 데 필요한 부분이지만 분명히 처음부터 어셈블리 코드를 작성한 경험은 컴파일러가 생성하는 opcode를 읽고 이해하는 것과 완전히 다른 것입니다. 어셈블리에서 내가 아는 책들은 그 부분을 잘 다루지는 않는다. 아마도 어셈블리와 연락을하고 나서 컴파일러 출력을 이해하려고 노력한다면 믿을 것이다.어셈블리 출력 이해에 대한 자습서/서적

컴파일러 출력을 해석하는 방법에 대한 자세한 자습서 (또는 책)를 알고 있습니까?

제가 염두에 두어야 할 공통적 인 고어 용 숙어의 표현과 일반적인 컴파일러 (msvc 및 gcc)에서 어셈블리로 변환하는 방법이 있습니다.

+0

MZ exe 파일을 해석하고 싶습니다. Google에서 mz exe를 검색하고 wikipedia를 팔로우하십시오. – Amir

답변

0

일부 c, C++ 파일을 컴파일하고 어셈블러 출력을 유지하고 (옵션 -s라고 생각합니다) 생성 된 출력을 소스 파일과 비교할 수 있습니다.

생성 된 어셈블러 코드를 이해하고 반복 패턴 (메소드/함수 호출, 리턴, 루프, 초기화 등)을 인식하는 데 도움이됩니다. 최적화를 활성화하지 않으면 생성 된 코드가 변형되어 이해하기 어렵게됩니다. SO에 여기

+0

필자는 과거에이 방법을 가르치기위한 방대한 실험을 해왔으며 (http://opensolaris.org/os/community/documentation/files/book.pdf 미안한 뻔뻔한 플러그 참조) 제안을 권장해야합니다 : _DO_ 최적화 사용. 단지 최고 수준이 아닙니다. 이것은 최적화되지 않은 어셈블러 코드가 불필요한 연산으로 가득차 있기 때문입니다. 약간 최적화 된 코드는 읽기가 훨씬 쉽습니다. –

+0

@FrankH : 컴파일러가 실제 최적화 수준보다 더 큰 부분을 차지한다는 것을 알게되면 MSVC는 최적화 스펙트럼의 양쪽 끝 부분에서 매우 읽기 쉬운 코드를 출력합니다. 적어도 내 관점에서는 GCC 생성 코드가 직접적인 톤 스택 액세스, 어쩌면 나는 GCC에서 올바르게 최적화 레벨을 설정하지 않고있다. P – Necrolis

2

모두 [x] x86 어셈블리를 읽는 것에 대해 알고 있는데, 디버거에서 디스 어셈블리 뷰를 사용하여 한 단계 씩 학습했습니다. opcode 참조를 동시에 열어 두는 것이 유용하지만, 컴파일러가 너무 많이 최적화하지 않는 한 C 소스에서 실제로 무엇을하는지 알기 때문에 대부분의 시간없이 살 수 있다는 것은 솔직히 말해서, 변수 내용 등

[*] 글쎄, 대부분의 것들.

+0

이것이 내가 배운 방법이다. 내가 읽은 유일한 어셈블리 '책'은 AMD와 인텔의 명령어 세트와 최적화 매뉴얼이다. IMO는이 루트를 사용하여 많은 책들 또는 2 초 튜토리얼보다 훨씬 많은 것을 제공합니다. – Necrolis

+0

@Necrolis : 당신은 저에게 더 많은 노력을 기울였습니다. 내 인생에 의존한다면 x86 어셈블리를 작성할 수 없습니다. 그러나 필요한 모든 사항은 최적화 프로그램이 이번에 수행 한 작업을 파악하는 것입니다. 중요하지 않습니다. –

+0

모든 것 * 나는 어렸을 때 TRS-80 Model 1에서 기계 코드를 프로그래밍하여 배웠던 어셈블리에 대해 배웠습니다. :) –

관련 문제