ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • boot.txt 해설
    만들면서 배우는 OS커널의구조와원리 2015. 4. 16. 20:04


    boot.txt


    파일은 별도로 첨부해놓겠다.



    [org 0]

    [bits 16]

    jmp 0x07C0:start


    start:

    mov ax, cs




    [arg 0]은 origin이라고 불리며, 이 프로그램이 메모리의 몇번지에서 실행하는지 컴파일러에게 알려주는 선언구문이다.

    프로그램상에서의 오프셋의 기준을 마련하는것이라고 할수있다.





    디스어셈블한 결과이다.


    실제번지수는 00000000부터 시작한다.


    옆에 옵코드가 나타나는데 CPU는 이 옵코드를 실행한다.


    그밑에 mov ax,cs의 번짓수를 보면 00000005로 되어있는데 해당이유는 그전의 옵코드가 5바이트이기때문이다.


    0xEA 0x0F 0x00 0xC0 0x07 0부터 4까지 차지하고 그다음주소는 5가된다.


    이제 다시 코드 해석으로 넘어가서 [bits 16]에 대해서 알아보겠다.


    [bits 16]은 프로그램이 16비트용으로 되어있다는것을 컴파일러에게 알려주는 구문이다.


    그리고 jmp 0x07C0:start는 07C0주소로 점프하라는 명령이다.


    바이오스가 MBR을 읽어들여 램의 물리주소 0x07C00에 복사한후 0x7C00으로 점프를 한다.


    바이오스가 점프할대는 0x0000:7C00 이런식으로 점프하기때문에 CPU에의해서 CS(Code Segment)에는 0x0000, IP레지스터에는 0x7C00이 들어가게된다.


    jmp 0x07C0:start 명령을 실행하면 start:로 점프를하고 CS에는 0x07C0, IP에는 0x5(start:)가 듳어가게된다.



    mov ax, cs

    mov ds, ax


    이 두명령은 그냥 값을 옮겨주는 역할을한다.


    CS에 들어있는값을 DS에 복사를하는데, 해석하면 코드세그먼트(CS)와 데이터세그먼트(DS)를 같은 값으로 사용하겠다는 소리이다.


    밑에쪽에 mov ax,word [msgBack]명령과 msgBack db '.', 0xE7라는 데이터를 저장해놓은 영역을 볼수있다. 


    word [msgBack]처럼 세그먼트를 지정하지않고 데이터를 사용하게되면 CPU는 자기혼자서 DS:msgBack으로, DS에있는 값을 세그먼트로 사용하겠다는 뜻으로 받아들여 오류가날수있다.



    **CS와 DS를 같게해주지않으면 프로그램은 한 세그먼트에 있기때문에 DS만이 다른 세그먼트를 지정하게되어 램상의 이상한곳에 데이터를 읽기,쓰기한다.



    mov ax, 0xB800

    mov es, ax

    mov di, 0

    mov ax, word [msgBack]

    mov cx, 0x7FF


    paint:

    mov word [es:di], ax

    add di, 2

    dec cx

    jnz paint



    mov ax, 0xB800명령으로 ax에 0xB800이라는 값을 집어넣고

    mov es, ax명령으로 0xB800값을 es레지스터에 집어넣는다.


    mov di,0으로 di에 0값을 집어넣는다

    mov ax,word[msgBack]으로 ax에 msgBack에 있는 값을 2바이트로 읽어들인다(word가 2바이트)

    mov cx,0x7FF로 cx에 데이터를 넣을 길이를 지정해준다. 뒤에서 cx를 계속 한개씩 줄여가며 메모리상에서 다 썼는지를 확인한다.


    paint: 반복문설정


    mov word [es:di], ax 지정된 주소에 값을 쓰는 부분이다. ax에는 msgBack에 들어있으며, 같은 값을 루프가 도는 동안에도 계속 유지한다.


    add di, 2는 주소값을 2바이트씩 더한다. 이로써 ax에 있는값을 다음 번지에도 넣을수있다.


    dec cx는 cx값을 1씩줄인다. 루프는 cx에 정해진 값만큼만 돌게된다. cx의 값이 0이되면 CPU Flag의 ZF가 ON된다.


    jnz paint는 조건분기문으로, paint부분으로 넘어가 루프를 돌게해준다. cx가 0이면 다음명령으로 넘어간다.


    위쪽에서 ax에 0xB800값을 집어넣는데 해당부분은 아래 사진을 참고하길바란다.





     




    '만들면서 배우는 OS커널의구조와원리' 카테고리의 다른 글

    boot.txt 해설(2)  (0) 2015.04.16
    부트스트랩  (0) 2015.04.16

    댓글

Designed by Tistory.