2012-09-23 2 views
0

일부 어셈블리를 MASM 용으로 읽고 있는데 세그먼트 지시문의 목적을 이해하는 데 어려움이 있습니다. 어셈블리 중 주소 계산의 라벨과 다른 점은 무엇입니까? 양식 지시문을 name segment at addr으로 가정합니다. 다른 옵션에 대해서는별로 신경 쓰지 않습니다. 무엇입니까MASM 세그먼트 지시문

BootSeg segment at 0x7c0 
BootSeg end 

아무 것도 없으면 좋겠습니까?

mov ax, BootSeg 

: 당신이 한 경우

당신은 도끼에 어떤 값을 가질 것인가?

+0

이것은 메모리 어드레싱 문제, 특히 리얼 모드 어드레싱입니다. Intel Developer 's Manual이나 Wikipedia에서 더 많이 배울 것을 권합니다. 또는 이와 유사한 질문을 확인하십시오 : http://stackoverflow.com/questions/12439241/finding-physical-address-in-8086-microprocessor – Jay

+0

@ 제이 나는 세그먼트 레지스터가 무엇이며 어떻게 작동하는지 알고 있습니다. 그 지시자에서 말하는대로 레지스터가 어떻게로드되는지 어셈블러가 어떻게 확신 할 수 있는지 이해할 수 없다. – Pyjong

+1

그렇지 않다. 해당 세그먼트 블록 내부의 모든 것이 특정 메모리 세그먼트에 있다는 것을 컴파일러에게 알려주므로 해당 세그먼트 블록 외부의 모든 코드가 'mov ax, BootSeg'와 같이 올바르게 참조 할 수 있습니다. 명시적인 세그먼트 주소 ('ORG' 지시어와 함께)는 보통 인터럽트 벡터 테이블, BIOS 데이터 영역, 비디오 메모리 등에 사용되며 실제 데이터는 바이너리에서 제공되지 않습니다. 이것은 특정 메모리 세그먼트에 고정되는 데이터 구조 템플릿과 같습니다. – Jay

답변

3

segment 지시어는 일종의 다용도입니다.

첫 번째 용도는 사물을 세그먼트로 결합하는 것입니다.

두 번째 용도는 다양한 세그먼트의 개체를 적절히 참조 (= 주소 계산)하는 것입니다. 코드에서 액세스중인 객체의 세그먼트에 따라 어셈블러에서 생성 된 코드에 적절한 segment override prefixes (es:, ss:, cs:, fs:, gs:)을 삽입 할 수 있습니다. 마찬가지로 다른 코드 세그먼트에서 procedure을 호출하면 어셈블러에서 near call 대신 far call 명령어를 생성 할 수 있습니다. AFAIR의 경우 실제로는 procedurefar으로 표시해야합니다 (루틴에서는 rets을 모두 far rets으로 변환 함).

그런 다음 세그먼트가 링커에서 처리되고 OS에서 사용하는 재배치 정보로 바뀝니다.

왜 이러한 세그먼트가 있습니까? CPU가 가지고 있기 때문에 항상 존재를 무시할 수는 없습니다. 코드, 데이터 및 스택을 단일 세그먼트에 맞출 수있는 DOS .COM 프로그램이 있습니다.이 경우 프로그램은 세그먼트의 개념으로 복잡해 질 필요가 없습니다 (일부 "외부"코드/자체 세그먼트가 아닌 데이터).

그리고 예, AT은 기본적으로 하나의 객체를 다른 객체 위에 겹쳐서 표시합니다. 따라서 mov ax, BootSeg은 다른 모든 세그먼트와 마찬가지로 ax = 0x7c0을 가져야합니다. 단, 여기서는 세그먼트를 "컴파일"시간이라고합니다.

디버거를 사용하십시오. 실험하십시오.