블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

Read Sector From Floppy

Programming 2008/07/17 22:53 귀차니스트
  음 일단 진행 됬던건.. BIOS가 처음 POST 과정을 끝내고 BIOS에서 지정된 순서로 부팅 디스크를 검색하여 Magic Sign에 해당하는 첫 번째 디스크의 첫 번째 섹터를 7C00h 번지로 올려준다는 것을 전제로 간단한 Hellow World 출력까지 진행했었기에, 어제 자기전까지 섹터 읽는 것을 구현을 해봤죠. 뭐 그다지 복잡한 것은 아니지만 괜히 삽질하고 있었더군요.

Sector.asm (Language : asm)
  1. [org 7C00h]
  2.  
  3. EntryPoint:
  4.     mov ax, 0000h
  5.     mov es, ax
  6.     mov ax, 0201h
  7.     mov cx, 0002h
  8.     mov dx, 0000h
  9.     mov bx, 7E00h
  10.     int 13h
  11.  
  12.     jmp PrintPoint
  13.  
  14. times 510-($-$$)    db 0
  15.     dw 0AA55h
  16.  
  17. %macro PRINT 1
  18.     pop dx
  19.     mov di, %1
  20.  
  21.     mov ah, 0Eh
  22.     xor bx, bx
  23.     mov cx, 14
  24.  
  25. printloop:
  26.     mov al, byte[di]
  27.     int 10h
  28.     inc di
  29.     loop printloop
  30. %endmacro
  31.  
  32. PrintPoint:
  33.     mov ax, 1301h
  34.     mov bx, 0007h
  35.     mov cx, 21
  36.     mov dh, 0
  37.     mov dl, 0
  38.     mov bp, MSGLOAD
  39.     int 10h
  40.  
  41.     ;PRINT MSGLOAD
  42.  
  43. Loading:
  44.     jmp Loading
  45.  
  46. MSGLOAD equ $
  47.     db "Message from Sector 2"

  일단 예전과는 다르게 PrintPoint로 EntryPoint를 변경한 뒤, 512바이트 뒤로 명령어 데이터를 옮겼습니다. 왜 이렇게 했냐하면 플로피디스크에서야 잘 모르겠지만 나중에 하드디스크 MBR에 이미지를 Write하여 부팅을 하려고 할 때, 파티션 데이터에 대한 처리를 쉽게 허용하기 위해서 였죠.
  기본적으로 한 섹터는 512바이트이기 때문에, 첫 번째 512바이트는 7C00h번지로 올라가게 되고, 512 바이트 뒤의 데이터는 플로피 같은 디스크 매체에 그대로 남아있게 됩니다. 별도의 로딩과정이 존재하지 않게 되죠. 하지만 512바이트로는 뭐 콩을 구워먹을래도 할 수 있는 일이 없기 때문에 디스크 매체에서 데이터를 읽어들여야 합니다.
  그래서 INT13H의 02H인터럽트를 통하여 2번째 섹터를 읽어 7C00h + 512바이트 주소인 7E00h번지로 로딩을 하게 설정합니다. 기본적인 인자값은 위키피디아에 존재하므로 그 부분을 감안하여 본 뒤 작성하시면 됩니다. 맨 처음 [ORG 7C00h]라는 Directive로 해당 명령어의 시작 지점이 7C00h라는 것을 알려주었기 때문에 생성되는 Label 및 변수에 대해서 주소값은 7C00h를 상대값으로 가지게 됩니다.
  결국 컨트롤이 쉽게 된달까요. 뭐 어찌되었던 512바이트 이후에 예전에 작성했던 코드를 밀어넣고 INT13H를 호출한 후 해당 메모리 주소로 점프를 합니다. 그럼 섹터가 로딩되기 전엔 쓰레기 값이 들어있었을 메모리에 제대로 된 명령어들이 들어있게 되고, 출력 명령어를 잘 수행하게 되죠. 다만 여기서 중요한 것은 02H에 해당하는 Sector Address는 1이 MBR이고 2가 두 번째 섹터더군요. 너무나 인덱스에서 0에 익숙해져 있는 관계로 1을 적었다가 왜 안되지 했었습니다.

Trash.asm (Language : asm)
  1. [org 7C00h]
  2.  
  3. EntryPoint:
  4.     mov ax, 0000h
  5.     mov ds, ax
  6.     mov si, DAPStruture
  7.     mov ah, 42h
  8.     mov dl, 00h
  9.     int 13h
  10.  
  11.     jmp PrintPoint
  12.  
  13. DAPStruture:
  14.     db 10h      ;sizeof(DAP)
  15.     db 00h      ;zero
  16.     db 01h      ;read sector count
  17.     db 00h      ;zero
  18.     dw 0000h        ;segment
  19.     dw 7E00h        ;offset
  20.     dq 0000000000000001h    ;number of sector
  21.  
  22. times 510-($-$$)    db 0
  23.     dw 0AA55h
  24.  
  25. %macro PRINT 1
  26.     pop dx
  27.     mov di, %1
  28.  
  29.     mov ah, 0Eh
  30.     xor bx, bx
  31.     mov cx, 14
  32.  
  33. printloop:
  34.     mov al, byte[di]
  35.     int 10h
  36.     inc di
  37.     loop printloop
  38. %endmacro
  39.  
  40. PrintPoint:
  41.     mov ax, 1301h
  42.     mov bx, 0007h
  43.     mov cx, 21
  44.     mov dh, 0
  45.     mov dl, 0
  46.     mov bp, MSGLOAD
  47.     int 10h
  48.  
  49.     ;PRINT MSGLOAD
  50.  
  51. Loading:
  52.     jmp Loading
  53.  
  54. MSGLOAD equ $
  55.     db "Message from Sector 2"

  별개로 이 것은 위키피디아를 읽다가 42H에 해당하는 기능이 읽어보니 훨씬 좋은 기능을 지원하길래 혹시나 하고 작성해봤던 코드입니다. 액세스할 수 있는 주소가 엄청 크기 때문에 원하는 곳을 모두 액세스 할 수 있었는데, 어제 테스트해본 결과론 죽어라 해도 안되더군요. 결국 오늘 까마구 횽님과 대화하다가 다른 문서에서도 플로피에 대한 언급이 없었다고, 이 것은 아무래도 하드디스크에서만 지원하는 것 같다는 결론을 얻게 되었습니다.
  그럼 오늘은 시간이 될 지는 모르겠습니다만 GDT, IDT, LDT에 대해서 자료를 보고 한 번 설정을 해봐야 겠군요^^. 뭐 어떻게 될지는 잘 모르겠지만 잘 되리라 믿습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"Programming" 분류의 다른 글

한게임 자동테트리스 Ver 0.6 (22)2008/11/15
한게임 자동테트리스 Ver 0.2 (22)2008/11/03
어제 무작정 맹글어봤던 것입니다.. (2)2008/07/16
Com Control에서 Event 제작하기 (0)2008/07/10
Com 개체를 Retun in Com Programming (2)2008/07/08
2008/07/17 22:53 2008/07/17 22:53
TAG Sector
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/93

댓글을 달아 주세요

◀ 이전페이지 1 ... 15 16 17 18 19 20 21 22 23 ... 110 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (110)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (19)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (31)
    • Document (4)

최근에 올라온 글

  • Gradient 작성중에 있습.... (3)
  • 게임&인터랙티브 애플리....
  • 한게임 자동테트리스 Ve.... (24)
  • Intel 64 And IA32 Arch.... (2)
  • 한게임 자동테트리스 Ve.... (24)

최근에 달린 댓글

  • 다운어덯게 받아요. difl 2008
  • 멋있네요 ㅎㅎ. 준호씨 2008
  • ^^; 그러셨군요.. 사실 동영.... 귀차니스트 2008
  • ㅋㅋ 속도 튜닝의 무서움 ㅜ.... 귀차니스트 2008
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 2008

달력

«   2009/01   »
일 월 화 수 목 금 토
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2008/12 (1)
  • 2008/11 (4)
  • 2008/10 (2)
  • 2008/09 (3)
  • 2008/08 (5)

태그목록

  • Hilight
  • Directive
  • Mouse Message
  • boost::array
  • RLE8
  • ASM
  • Application.Run
  • 디코드
  • Sector
  • Run Length
  • DP
  • 관악기
  • C++
  • 타이틀
  • Singleton
  • Array
  • Catch
  • Reference
  • Call By Reference
  • 프로그래밍
  • std::auto_ptr
  • 멀티맵
  • 폰트
  • .Net
  • SSD
  • HP
  • boost::random
  • Graphi
  • Generics
  • HTML Parser

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net