2011-02-04 5 views
7

현재 저는 재미있게 x86 어셈블리를 배우는 중입니다. 저는 마이크로 컨트롤러 프로그래밍이 너무 좋아서 어셈블리에 익숙합니다.어셈블리 : 데이터 세그먼트 레지스터 (DS)

현재이 질문에 대한 답변은 높거나 낮았지만 찾지 못했습니다 ... DS 등록 정보, 내 프로그램의 글로벌 데이터를 가리키는 것으로 알고 있지만 정확히 어떻게 작동하는지 모르겠습니다. 나는 NASM을 사용하고 내가 보는 가장 간단한 프로그램에서 다음 해요 :

 
[org 0x7C00] 
[bits 16] 

main: 
mov ax, 0x0000 
mov ds, ax 
mov al, [msg] 
mov ah, 0x0E 
mov bx, 0x0007 
int 0x10  
jmp $ 

msg db 'X' 

times 510-($-$$) db 0 
dw 0xAA55 

을하고 완벽하게 (내가 굵은 코드를 생략 할 경우에도) 작동하지만, 어떻게? CPU가 자동으로 0x0000에서 시작하는 전역 변수를로드합니까? 또는 내가 여기없는 본질적인 뭔가가 있습니까?

+0

가능한 복제본 : http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly, http://stackoverflow.com/questions/4119504/real-mode-memory-addressing -explanation/33581044 # 33581044 –

답변

12

컴퓨터가 리얼 모드 (BIOS가 부트 로더를 실행할 때 CPU가있는 모드) 인 경우 CPU가 주소를 계산하는 데 사용하는 방법은 매우 간단합니다. 세그먼트 레지스터 값에 16을 곱합니다 (시프트 비트 4 위치 왼쪽으로), 오프셋을 추가하십시오.

예를 들어 "mov ax, [0x1234]"와 같은 명령어에서 CPU는 "DS * 0x10 + 0x1234"를 유효한 주소로 사용합니다 (첫 번째 용어는 귀하의 경우 0으로 결정됩니다). "mov ax, [BP + 0x32]"그러면 CPU는 "SS * 0x10 + BP + 0x32"를 사용합니다. 이제 CPU가 다른 세그먼트 레지스터 (스택 세그먼트)를 사용했음을 주목하십시오. BP 레지스터를 사용할 때 CPU는 기본적으로 스택에 액세스하지 않을 것으로 가정하기 때문입니다 (단, [DS : BP + 0x32]).

더 자세히 설명해 드리지만 더 자세한 내용은 http://wiki.osdev.org/Real_Modehttp://www.internals.com/articles/protmode/realmode.htm에 있으며 더 많은 장소가 있습니다.

현재 "msg"는 0x7C11 주소에 다소 차이가 있습니다.

+0

고마워! 이것은 내 질문에 완벽하게 대답했습니다^_ ^. –