2009-11-03 2 views

답변

15

다른 답변에 따르면 offset 키워드는 정의 된 세그먼트의 오프셋을 나타냅니다. 그러나 세그먼트가 겹칠 수 있으며 한 세그먼트의 오프셋이 다른 세그먼트에서 다를 수 있습니다. 그래서 어디든지,

mov ax, 2000h 
mov ds, ax 

mov bx, offset foo ; bx = 0100h 
mov byte ptr [bx], 10 ; foo = 10 

mov ax, 3000h 
mov ds, ax 

mov bx, offset foo; bx = 0100h 
mov byte ptr [bx], 10 ; bar = 10 

어셈블러는 foodata SEGMENT의 기지에서 0100h 오프셋에 있음을 본다 : 예를 들어, 당신은

data SEGMENT USE16 ;# at 02000h 

    org 0100h 
    foo db 0 

    org 01100h 
    bar db 0 

data ENDS 

리얼 모드에서 다음 세그먼트를하고 다음 코드를 보면 가정 offset foo을 보면 그 당시의 DS 값에 관계없이 0100h 값을 넣을 것입니다.

DS0300h이므로 DS이 나타내는 세그먼트의 기준은 03000h입니다. 즉, ds:[offset foo]은 주소가 03000h + 0100h이고 02000h + 01100h과 같으며 bar을 가리 킵니다.

편집 : 오프셋 코드

6

단지 그 기호의 주소를 의미합니다. C에있는 & 연산자와 비슷합니다. 익숙하다면 말이죠.

1

x86 16 비트 모드에서 주소 공간은 평평하지 않습니다. 대신 주소는 오프셋과 "세그먼트"로 구성됩니다. "세그먼트"는 64K 공간을 가리키며, 오프셋은 해당 공간 내에 있습니다.

http://en.wikipedia.org/wiki/Memory_segmentation

3

offsetsi 레지스터가 (되지 실제 값) 가변 VALUE1 오프셋과 동일 할 것이라는 것을 의미 참조. 오프셋은 변수가 저장되는 메모리 세그먼트의 시작 부분부터의 주소입니다. 오프셋은 일반적으로 ds 세그먼트 (귀하의 경우 dscs 레지스터가 같은 세그먼트를 가리키고 있음)와 관련됩니다.

1

에서 수정 논리적 오류는 기본적으로 세그먼트 포인트 (또한 데이텀 점)까지의 거리이다. 예를 들어 세그먼트 주소가 0000이고 오프셋 또는 논리 주소가 0100이면 두 개의 쌍을 추가하여 실제 주소를 계산할 수 있습니다. 물리적 주소 = + 0,100 0,000 = 우리 필요한 위치 세그먼트 어드레스 1DDD이다 마찬가지로 경우 0100 의 주소에 오프셋 후 0100 0100 의미 물리 주소는 : + 0100 = 1EDD

1DDD

수단 목적지는 1EDD입니다.

관련 문제