2010-07-26 7 views
2

내가 아는 바로는 16 비트 PC 시대의 세그먼트 레지스터에는 각 세그먼트 유형의 주소가 포함되어 있으며 SS : [EDI]와 같은 오프셋으로 액세스 할 수 있습니다.이 값은 스택 세그먼트에 대한 오프셋으로 EDI.어셈블러 : 32 비트 시스템에서 세그먼트가 어떻게 사용됩니까?

이제는 32 비트 시스템에서 GDT (Global Descriptor Table)와 LDT (Local Descriptor Table)를 사용했음을 알고 있습니다. 세그먼트에는 이제 해당 테이블에 인덱스가 포함되어 있으며 오프셋을 계산할 수 있습니다. 오른쪽 메모리 주소.

내 이해가 정확합니까?

PUSH DWORD PTR SS : [EBP + 8]; basicbof.00401000

그렇다면 32 비트 OS (XP SP2)에서이 같은 내용을 어떻게 나타낼 수 있습니까?

답변

3

세그먼트 레지스터에는 이제 선택기가 포함됩니다. 각 선택자는 글로벌 또는 로컬 디스크립터 테이블의 인덱스와 요청 된 보안 레벨을 더한 것입니다. 예를 들어

:

mov ds, 0x0000 

는 DS에 액세스 레벨 0, 0 테이블 (GDT)로부터 선택기 0을 둘 것이다. (이것은 널 포인터 테스트에 사용되는 특수 레지스터입니다).

테이블에는 각 선택기에 대한 기본 + 길이 정보가 들어 있으므로 더 이상 64K로 제한되지 않습니다 (단, 0에서 4GB까지 가능).

가장 좋은 방법은 (무료로 제공되는) 인텔 프로세서 문서를 읽는 것입니다.

편집 : link

0

PHU - 나중에 10 년 내 지식이 약간 녹슨입니다.

sukru 대답은 내가 기억하는 것입니다. StackSegment에서 DWORD를 가지고 :

나는 어셈블리 문으로 해석 할 BasePointer + 8 (= 지역 변수 또는 메소드 매개 변수 - 기억할 수없는)와 SS DS 것을 스택에

0

주의를 넣어 ES 등 셀렉터는 동일한 (일반적으로 4kbyte) 페이지를 가리 키기 때문에 사용자 영역에 무의미합니다. 커널 프로그래밍에 대해 어떻게 생각하는지 모르겠다.