2012-03-21 2 views
4

어셈블리 프로그램에서 (섹션 지시문을 사용하여 선언 된) 섹션을 어셈블러와 링커에서 처리하는 방법을 명확하게 이해하지 못했습니다. 다음은 쿼리의 일부는 다음과 같습니다어셈블리 언어 프로그램의 섹션

  • (표준는 .text, .data와, .bss라고 이외의 부분) 사용자 정의 섹션의 사용은 무엇입니까?

  • 데이터 섹션에 코드를 넣고 코드 섹션에 데이터를 넣으면 어떻게 될까요? 어셈블러는 어떻게 처리합니까?

  • 프로그램에서 섹션이 선언되지 않으면 어셈블러는 무엇을합니까?

  • 사용자 정의 섹션 (텍스트, 데이터 및 bss 없음) 만 선언 된 경우 어셈블러에서 수행 할 작업은 무엇입니까?

각 경우에 프로그램이 작동하는지 테스트하려면 어셈블리 프로그램을 작성할 수 있지만 개념을 명확히하고 싶습니다.

답변

2

섹션은 독립적 인 메모리 시퀀스입니다. 각각의 새로운 데이터 바이트는 현재 열려있는 "프로그램 섹션"에 배치됩니다. 메모리에로드 될 때 메가 바이트 또는 기가 바이트가 될 수도 있지만 관련 데이터를 소스 코드에서 아주 가깝게 유지하는 기능을 작성하는 것이 매우 편리합니다.

사용자 정의 프로그램 섹션은 표준 섹션과 동일한 방식으로 작동하지만 일반적으로 링커 및 기타 코드 후 처리 도구에 추가 정보를 제공해야 합리적인 방법으로 메모리에로드 할 수 있습니다.

데이터 섹션에 실행 가능 코드를 배치 할 수 있으며 그 반대의 경우도 있습니다. 대부분의 어셈블러는 경고도 내지 않습니다. 데이터 섹션에서 코드를 실행하면 약간의 트릭이 필요할 수 있습니다. 반대는 보통 쉽다.

어셈블러는 일반적으로 소스 코드와 동일한 순서로 객체 모듈에 해당 항목을 작성하고 유사한 섹션을 링커에 다시 배치하는 방식으로 섹션을 처리합니다. 가장 단순한 어셈블러 만이이 기능을 제공하지 않습니다. 원래의 MSDOS .COM 파일 어셈블러가 염두에두고 있습니다.

다른 어셈블러는 프로그래머를 coddling에 대한 다른 철학을 가지고 있습니다. 전통적인 기법은 어셈블리 언어 프로그래머가 자신이하는 일을 알고 있다고 가정하고 이해되지 않은 것을 제외하고는 그대로 쓰는 것입니다. 다른 어셈블러가 더 유용합니다 (또는 엉덩이의 관점, 당신의 관점에 따라 다름). 정렬되지 않은 멀티 바이트 구조, 데이터 또는 코드 유형 불일치 등에 대해 불평합니다.

"유용성 "를 사용하면 프로그램 섹션을 시작하지 않으면 기본 동작 (일반적으로 가정 된 코드 .psect)이 발생하거나 치명적인 오류로 어셈블되지 않습니다. 가장 구조화 된 어셈블러조차 텍스트, 데이터 또는 bss가 없는지 상관하지 않습니다. 실제로, 데이터 (또는 코드) 바이트가 전혀없는 심볼 정의로만 구성된 유용한 객체 모듈이 있습니다.

+0

어셈블러가 섹션 재배치를 수행하지 않습니까? – vjain27

+0

이러한 경우 링커가 어떻게 작동하는지 알려주시겠습니까? – vjain27

+0

설명 주셔서 감사합니다! 내 마음 속에 아직도 남아있는 한가지는 텍스트 나 데이터 섹션이 선언되지 않았고 어셈블러가 링커가 무엇을 신경 쓰지 않는가하는 것입니다. 실행 파일에 텍스트 및 데이터 섹션이 필요하지 않습니까? – vjain27