[org 0] [bits 16] jmp 0x07c0:start ; far jump 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, 0x07ff ; 0x07ff (10진수 2047)개의 ; word가 필요하다. paint: mov word [es:di], ax ; 비디오 메모리에 쓴다. add di, 2 ; 한 word를 썼으므로 2를 더한다. dec cx ; 한 word를 썼으므로 cx의 값을 하나 줄인다. jnz paint ; cx가 0이 아니면 다시 나머지를 쓴다. mov edi, 0 ; 제일 윗줄의 처음에 쓸 것이다. mov byte [es:edi], 'D' inc edi mov byte [es:edi], 0x16 inc edi mov byte [es:edi], 'o' inc edi mov byte [es:edi], 0x16 inc edi mov byte [es:edi], 'n' inc edi mov byte [es:edi], 0x16 inc edi mov byte [es:edi], '1' 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], '3' inc edi mov byte [es:edi], 0x06 ; inc edi jmp $ ; 이 번지에서 무한루프를 돈다. msgBack db '.', 0x67 times 510-($-$$) db 0 ; 여기서부터 509번지까지 0으로 채운다. dw 0xaa55 ; 510번지에 0x55를, 511번지에 0xaa를 넣어둔다.
실행 결과
'만들면서 배우는 OS커널의 구조와 원리 > 제1장 부트스랩' 카테고리의 다른 글
Boot Record Signature AA55 Not Found (0) | 2013.06.02 |
---|