문제

16 비트 실제 모드에 대한 예제 어셈블리 코드를 살펴보고 있습니다.

나는 줄을 만났다 :

    mov    bx, cs
    mov    ds, bx
    mov    si, OFFSET value1
    pop    es
    mov    di, OFFSET value2

이게 뭐하는거야? 거기에 '오프셋'이있는 것은 무엇입니까?

도움이 되었습니까?

해결책

다른 대답 중 일부는 말한 것처럼 offset 키워드는 정의 된 세그먼트의 오프셋을 나타냅니다. 그러나, 세그먼트가 겹칠 수 있고 한 세그먼트의 오프셋이 다른 세그먼트에서 다를 수 있음을 주목하십시오. 예를 들어, 실제 모드에 다음 세그먼트가 있다고 가정합니다.

data SEGMENT USE16 ;# at segment 0200h, linear address 2000h

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS

어셈블러는 그것을 본다 foo 오프셋에 있습니다 0100h 기지에서 data SEGMENT, 그것이 어디에 있든 offset foo 가치를 부여합니다 0100h, 가치에 관계없이 DS 당시.

예를 들어, 우리가 변하면 DS 의 기초가 아닌 다른 것 data 세그먼트 어셈블러는 다음을 가정합니다.

mov ax, 200h            ; in some assemblers you can use @data for the seg base
mov ds, ax

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


mov ax, 300h
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; bar = 10, not foo, because DS doesn't match what we told the assembler

두 번째 예에서 DS ~이다 0300h, 그래서 세그먼트의베이스는 DS ~이다 03000h. 이것은 그것을 의미합니다 ds:[offset foo] 주소를 가리 킵니다 03000h + 0100h 그것은 동일합니다 02000h + 01100h, 그것은 가리킨다 bar.

다른 팁

그것은 단지 그 기호의 주소를 의미합니다. 당신이 그것에 익숙하다면 그것은 & 운영자와 비슷합니다.

offset 그것을 의미합니다 si 레지스터는 변수의 오프셋과 동일합니다. value1 (실제 가치가 아님). 오프셋은 변수가 저장되는 메모리 세그먼트의 시작 부분의 주소입니다. 오프셋은 일반적으로 상대적입니다 ds 세그먼트 (귀하의 경우 ds 그리고 cs 레지스터는 동일한 세그먼트를 가리키고 있습니다).

에서 MASM 프로그래머 가이드 6.1 (Microsoft 매크로 어셈블러)

그만큼 오프셋 운영자

주소 상수는 오프셋 또는 세그먼트 값으로 구성된 특수 유형의 즉각적인 오페라입니다. 오프셋 연산자는 여기에 표시된대로 메모리 위치의 오프셋을 반환합니다.

    mov     bx, OFFSET var  ; Load offset address

MASM 5.1 동작과 MASM 6.1의 차이점에 대한 정보는 상쇄와 관련된 동작을 보려면 부록 A를 참조하십시오.

다른 모듈의 데이터는 단일 세그먼트에 속할 수 있으므로 어셈블러는 각 모듈에 대해 세그먼트 내의 실제 오프셋을 알 수 없습니다. 따라서 Var의 오프셋은 즉각적인 값이지만 링크 시간까지 결정되지 않습니다.

신중하게 읽으면 객체 코드를 "연결"하여 DLL/EXE를 작성 한 후 최종 값이 결정됩니다. 연결하기 전에 세그먼트의 기본 주소의 오프셋을 나타내는 즉각적인 값입니다.

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

보다 http://en.wikipedia.org/wiki/memory_segmentation

오프셋은 기본적으로 세그먼트 포인트 (Datum Point)로부터의 거리입니다. 예를 들어 세그먼트 주소는 0000이고 오프셋 또는 논리 주소는 0100입니다. 그러면 두 쌍을 추가하여 물리적 주소를 계산할 수 있습니다. 물리적 주소 = 0000+0100 = 0100은 필수 위치가 0100 주소에 있음을 의미합니다. 마찬가지로 세그먼트 주소가 1DDD이고 오프셋이 0100 인 경우 : 물리 주소는 다음과 같습니다. 1DDD+0100 = 1EDD

목적지가 1EDD임을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top