2016-09-30 5 views
2

을 사용하여 어셈블리 8086에서 데이터 세그먼트 레지스터 초기화되지만 로더는 메모리에 프로그램을로드하는 경우에만 실제 데이터 세그먼트 어드레스가 공지되어있다.
- @data 대신 어셈블러가 무엇을 넣는가?
- 로더가 실제 데이터 세그먼트 기본 주소를 가져 오는 경우 명령 mov AX, @data를 mov AX, 실제 기본 주소로 대체합니까?
-로드하는 단계 전에 실제 기본 주소를 알 수없는 경우이 문을 작성해야하는 이유는 무엇입니까?은 상기 데이터 세그먼트의 초기화 다음 두 문</p> <pre><code>mov AX, @Data mov DS, AX </code></pre> <p>등록 MASM 컴파일러

+0

어셈블러는 'mov AX, @ Data'에는 픽스 업이 필요합니다. 링커가 @Data를 세그먼트의 시작 부분에 상대적으로 채우고 DOS 로더에 의한 픽스 업을 표시 할 것입니다 (실행 파일의 헤더에 테이블을 수정했습니다). 프로그램을 실행할 때 DOS 프로그램 로더는 실행 파일에서 DOS 헤더를 읽고 DOS가 링커에 의해 명령에 배치 된 세그먼트가있는 프로그램을 물리적으로로드 한 세그먼트를 추가합니다. 그것은'@ Data'에 대한 런타임 값을 산출합니다. –

+0

DOS 프로그램을 다른 위치의 메모리에로드 할 수 있기 때문에이 모든 이유가 있습니다. 따라서 이러한 픽스 업을 제공해야합니다. 당신의 코드에서'mov AX, @ Data'' mov DS, AX'를하지 않고, _DS_ (데이터 세그먼트)는 런타임에 프로그램 자체로 알려지지 않을 것입니다. _DS_을 설정하지 않으면 메모리에서 읽고 쓸 수있는 변수를 읽고 쓰지 않아 프로그램이 예상대로 작동하지 않습니다. –

답변

1

컴파일러/어셈블러 삽입을 mov AX, @Data 같은 명령어를 프로그램에서 3 바이트 쓰기 할 때마다 :

  • 가 제 1 회 바이트가 오피 코드는, AX의 경우는
  • 제 2 회 0B8h
  • 될 것입니다 및 3 바이트는 함께 숫자를 나타냅니다. 어셈블러 무엇
  • 는 @data의 장소에 둔다?

이 번호는 실행의 개시 (메모리에 로딩 될 때) 및 데이터 섹션의 개시 사이의 거리를 나타낸다. 이 숫자는 16 바이트짜리 단락으로 표현됩니다.

  • 로더가이 mov 인 AX, 실제 자료 주소와 명령 mov 인 AX, @data가 대체됩니까 실제 데이터 세그먼트의 기본 주소를 가져옵니다

    ?

로더는 2 번째 및 3 번째 바이트 만 업데이트합니다. 그것은 첫 번째 바이트를 만지지 않습니다! 실제 기본 주소가 로딩 단계 전에 알 수없는 경우이 명령문을 작성하는 것이 필요하다 왜

  • ? 당신의 쓰기이 지침은 (이 많이있을 수 있습니다) 모든 곳

, 당신은 DOS 로더가 올바른 주소를 삽입 할 수있는 자리로 DOS를 제공합니다.