1. Pre..
이번엔 Hello World 를 출력하는 부트로더를 제작해 봅시다.
- 플로피디스크에 프로그램을 담아 부팅시켜보자.
2. Process
- 물리주소의 시작위치 정하기
- 'hello, world'의 메모리 공간 확보
- 비디오 서비스를 위한 BIOS 인터럽트를 걸어 화면에 출력
3. Code
[org 0] ; 물리주소 계산법 : (cs<<4)+ip+org
jmp 07c0h:start ; 0x7c00 , far jump
start:
mov ax, cs ; 0x7c05, cs = 0x7c00 세팅
mov ds, ax
mov es, ax
mov si, msg
print:
lodsb ; al <= [es:si], si++
cmp al, 0 ; msg 에 있는 문자열 반복 돌면서 차례대로 넣음 , 끝나면 hang 으로 점프
je hang
mov ah, 0Eh
mov bx, 7
int 10h ; BIOS interrupt : Video Services : http://en.wikipedia.org/wiki/BIOS_interrupt_call
jmp print
hang:
jmp hang
msg db 'hello, world', 0
times 510 - ($-$$) db 0
dw 0AA55h
% 물리주소의 시작위치 정하기
- BIOS가 MBR을 읽어 램의 물리 주소 0x7c00 번지에 복사한다.
그리고 프로그램이 메모리의 몇 번지에서 실행해야 하는지를 컴파일러에게 알려주어야 한다.
이 선언문이 [ org 번지수 ] 이다.
[ org 번지수 ] 의 표기 방법에 따라 우리 프로그램은 [ org 0x7c0h ] 로 표기할수 있다.
그러나 [ org 0x7c0h ] 의 표기 방법보다 기준주소 + 오프셋 표기법이 주소 계산에 편리하기 때문에
[ org 0 ] 을 사용하고 직접 실행햐야할 주소를 jmp 문을 사용해 알려준다.
다음과 같이 jmp 0x7cOh:start 문을 사용하여 바로 start 라벨이
( 또는 0x7C0h 에서 오프셋이 start 만큼 떨어진곳 ) 있는곳 부터 시작한다.
바이오스도 처음 점프 할때 0x0000:7C00 방식으로 점프한다.
그래서 CPU에 의해 자동적으로 CS(코드 세그먼트) 레지스터에는 0x0000 이,
IP(프로그램 카운터) 레지스터에는 0x7C00이 들어 있는 상태가 된다.
% 메모리 공간 확보
- 어셈블리 문법인 데이터 정의문(data definition statement)을 사용 하여 db 'hello world', 0 표기 한다.
마지막 0은 NULL 이다.
db -> 8 비트 정수
dw -> 16 비트 정수
dd -> 32 비트 정수 또는 실수
dq -> 64 비트 정수 또는 실수
dt -> 80 비트 10바이트 정의
% Start 가 0x5 로 바뀐 이유
어셈을 아시는 분은 아시겠지만, 저 줄의 총 바이트 수가 5바이트 이기 때문입니다.
( 컴파일러가 바이너리에는 반영이 안됨 )
4. Run
5. Disassem
00000000 EA0500C007 jmp word 0x7c0:0x5
00000005 8CC8 mov ax,cs
00000007 8ED8 mov ds,ax
00000009 8EC0 mov es,ax
0000000B BE1E00 mov si,0x1e
0000000E AC lodsb
0000000F 3C00 cmp al,0x0
00000011 7409 jz 0x1c
00000013 B40E mov ah,0xe
00000015 BB0700 mov bx,0x7
00000018 CD10 int 0x10
0000001A EBF2 jmp short 0xe
0000001C EBFE jmp short 0x1c
0000001E 68656C push word 0x6c65
00000021 6C insb
00000022 6F outsw
00000023 2C20 sub al,0x20
00000025 776F ja 0x96
00000027 726C jc 0x95
00000029 640000 add [fs:bx+si],al
0000002C 0000 add [bx+si],al
....
000001FC 0000 add [bx+si],al
000001FE 55 push bp
000001FF AA stosb
'Security > Kernel & OS' 카테고리의 다른 글
[Operation System] 6. OS 만들기 - Kernel Load - 1 (0) | 2014.07.14 |
---|---|
[Operation System] 5. OS 만들기 - BootStrap - 4 (0) | 2014.07.14 |
[Operation System] 4. OS 만들기 - BootStrap - 3 (0) | 2014.07.14 |
[Operation System] 2. OS 만들기 - BootStrap - 1 (0) | 2014.07.14 |
[Operation System] 1. OS 만들기 - 준비물 (0) | 2014.07.14 |