Restart |
From Evernote: |
[Restart_OS#1] 0319Clipped from: http://happydal.blogspot.com/2010/07/%EB%A0%88%EC%A7%80%EC%8A%A4%ED%84%B0.html |
; 함수나 제어문 같은 명령어들이 저장되는 코드 세그먼트의 세그먼트 셀렉터를 포함하고 있으며 이를 참조하여 EIP를 이용해 명령어의 주소를 계산한다.
ex> CS가 0x1b일 경우 2진값은 0b0000 0000 0001 1011 이 된다. (위 그림 참조) TI는 0이므로 Global 디스크립터, RPL은 3(11)이므로 유저모드, 인덱스 00...011이므로 3번째 인덱스임을 알수 있다. 디스크립터 테이블의 3번째 인덱스를 살펴보면 해당 세그먼트의 자세한 정보를 알 수 있는데 이 정보는 WinDBG와 같은 커널 디버거 프로그램을 이용하면 된다.
* DS (Data Segment)
; 주로 전역, 정적 변수 데이터가 들어있는 데이터 세그먼트의 데이터 위치를 가르키는 레지스터로 CS레지스터와 같은 방법으로 정보를 얻을 수 있다. 이 정보를 통해 얻을 수 있는 주소 범위 내에서 명령어 내부의 오프셋을 더해 찾고자하는 데이터의 위치를 구할 수 있다.
* SS (Stack Segment)
; 주소와 데이터를 일시적으로 저장할 목적으로 쓰이는 스택의 주소를 지정하는데 쓰인다.
* ES (Extra Segment)
; 복사 작업시 Destination의 주소가 저장된다. 주로 ESI 레지스터가 가리키는 주소의 데이터가 복사된다.
[bits 16]
jmp 0x07C0:start ;far jmp를 한다.
start:
mov ax,cs ;cs에는 0x07c0이 들어있다.
mov ds,ax ;ds를 cs와 같게 해준다.
mov ax,0xB800 ;비디오 메모리의 세그먼트를
mov es,ax ;es 레지스터에 넣는다.
mov di, 0 ;제일 윗줄의 처음에 쓸것이다.
mov ax,word[msgBack] ;써야 할 데이터의 주소 값을 지정한다.
mov cx,0x7FF ;화면 전체에 쓰기 위해서는
;0x7FF(2047)개의 WORD가 필요하다.
paint:
mov word[es:di],ax ;비디오 메모리에 쓴다.
add di,2 ;한 WORD를 썼으므로 2를 더한다.
dec cx ;한 WORD를 썼으므로 CX의 값을 하나 줄인다.
jnz paint ;CX가 0이 아니면 paint로 점프하여 나머지를 더 쓴다.
mov edi,0 ;제일 윗줄의 처음에 쓸것이다.
mov byte [es:edi], 'J' ;비디오 메모리에 쓴다.
inc edi ;한 개의 BYTE를 썼으므로 1을 더한다.
mov byte [es:edi],0x06 ;배경색을 쓴다.
inc edi ;한 개의 BYTE를 썼으므로 1을 더한다.
mov byte [es:edi], 'A'
inc edi
mov byte [es:edi],0x06
inc edi
mov byte [es:edi], 'C'
inc edi
mov byte [es:edi],0x06
inc edi
mov byte [es:edi], 'K'
inc edi
mov byte [es:edi],0x06
inc edi
mov byte [es:edi], '2'
inc edi
mov byte [es:edi],0x06
inc edi
mov byte [es:edi], '_'
inc edi
mov byte [es:edi],0x06
inc edi
mov byte [es:edi], 'S'
inc edi
mov byte [es:edi],0x06
inc edi
mov byte [es:edi], 'O'
inc edi
mov byte [es:edi],0x06
inc edi
mov byte [es:edi], 'S'
inc edi
mov byte [es:edi],0x06
inc edi
jmp $ ;이 번지에서 무한루프를 돈다.
msgBack db '*',0xE7 ;배경색으로 사용할 데이터
times 510-($-$$) db 0 ;여기서부터 509번지까지 0으로 채운다.
dw 0xAA55 ;510번지에 0xAA, 511번지에 0x55를 넣어둔다.
중요한 명령인자만 살펴보자면
-L . 은 바이오스파일을 불러오는 명령어입니다. 뒤에 .(점)은 경로입니다.
-boot c는 부팅을 하드디스크로 하겠다는 의미입니다. A는 플로피, D는 시디롬이 됩니다.
-m 256은 메모리를 256메가로 잡아주겠다는 의미입니다.
-hda "경로"는 "경로"를 0번 하드디스크로 사용하겠다는 의미입니다.
* Real Mode
*세그먼트와 오프셋(Segment & Offset)