2013-07-22 3 views
3

리얼 모드에서 세그먼트의 크기에 대해서는 의심의 여지가 있습니다. 최대 64K는 될 수 없지만 less than that. 일 수 있습니다. 제 질문은 이러한 세그먼트 크기와 기본 주소가 초기화되는 방식입니다. 마찬가지로 GDT와 LDT가 보호 모드에 있습니다. Real mode segments can also overlapped,disjoint or adjacent. BIOS에는 부팅 코드, 비디오 버퍼 등의 특정 항목을위한 일부 예약 된 영역이 있습니다. 어셈블리 프로그램에서 이와 같은 작업을 수행해야합니까?세그먼트 크기가 x86 리얼 모드

+0

http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly || http://stackoverflow.com/questions/4119504/real-mode-memory-addressing-explanation/33581044#33581044 –

답변

1

리얼 모드에서는 세그먼트 화 된 주소가 메모리에 고정되어 있습니다. 실제 주소를 얻으려면 다음 방정식을 사용하십시오.

physical address = segment * 16 + offset 

세그먼트 및 오프셋 주소는 모두 16 비트입니다. 이 방정식을 사용하면 문제없이 20 비트 주소 하나를 만들고 640kB RAM에 액세스 할 수 있습니다.

일부 세그먼트의 위치를 ​​유지하는 테이블이 없습니다. 문제는 모든 주소에 액세스 할 수 있도록 세그먼트 및 오프셋 레지스터를 모두 설정해야한다는 것입니다. 따라서 오프셋 레지스터를 증가시키는 간단한 루프만으로 최대 64KB의 RAM 바이트에 액세스 할 수 있으므로 플랫 모드보다 큰 버퍼에 대한 메모리 액세스가 덜 편리합니다.

+0

답장을 보내 주셔서 감사합니다. 그럼 어셈블리 프로그래머의 업무가 세그먼트의 기본 주소와 크기를 결정하는 것입니다. 한 세그먼트? 그렇다면 세그먼트가 겹칠 수 있고 겹쳐진 다른 세그먼트를 다른 프로그램에서 사용할 수 있으므로 데이터가 손상 될 수 있습니까? 두 개의 MSDOS 프로그램이 보호 기능이 없으므로 메모리 할당 방법을 실행한다고 가정 해 보겠습니다. –

+0

DOS에서 메모리 관리가 어떻게 작동하는지 모르겠지만 여기에 메모리 주소 테이블이 있습니다 : http://webpages.charter.net/danrollins/techhelp/0094.HTM DOS 프로그램을 만드는 경우주의해야합니다 다른 .com 드라이버 나 TSR 루틴을 덮어 쓰지 않습니다. 보통 하나의 DOS 프로그램 만 동시에 실행합니다. – nio

+1

@nio : 개체가 단락 정렬되도록 정렬하는 경우 개체 내의 알려진 오프셋에 저장된 항목에 액세스하기 위해 세그먼트 레지스터 만로드하면됩니다. 이 기능을 활용하는 컴파일 된 언어는 모르지만 어셈블리 코드에서는 일반적인 트릭입니다. – supercat

관련 문제