1. make.bat 설정
..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9

2. Makefile

# 디폴트 동작

default :
 ../z_tools/make.exe img

# 파일 생성 규칙

ipl.bin : ipl.nas Makefile
 ../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

helloos.img : ipl.bin Makefile
 ../z_tools/edimg.exe   imgin:../z_tools/fdimg0at.tek \
  wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

# 커맨드

asm :
 ../z_tools/make.exe -r ipl.bin

img :
 ../z_tools/make.exe -r helloos.img

run :
 ../z_tools/make.exe img
 copy helloos.img ..\z_tools\qemu\fdimage0.bin
 ../z_tools/make.exe -C ../z_tools/qemu

install :
 ../z_tools/make.exe img
 ../z_tools/imgtol.com w a: helloos.img

clean :
 -del ipl.bin
 -del ipl.lst

src_only :
 ../z_tools/make.exe clean
 -del helloos.img

보시면 알겠지만 배치 파일로 링크가 되어 있어서 쉽게 접근을 여러 명령어를 종합해서 사용할 수 있음을 보여줍니다. 일종에 매크로 같은 거군요.

..>make run 를 쳐 보았습니다.


위와 같이 가상으로 Hello World 가 찍혔네요.
이제 시작이네요.
간단하게 어셈블리 언어를 보자면 아래와 같습니다.
; hello-os
; TAB=4

  ORG  0x7c00   ; 이 프로그램이 어디에 read되는가

; 이하는 표준적인 FAT12 포맷 플로피 디스크를 위한 기술

  JMP  entry
  DB  0x90
  DB  "HELLOIPL"  ; boot sector이름을 자유롭게 써도 좋다(8바이트)
  DW  512   ; 1섹터 크기(512로 해야 함)
  DB  1   ; 클러스터 크기(1섹터로 해야 함)
  DW  1   ; FAT가 어디에서 시작될까(보통은 1섹터째부터)
  DB  2   ; FAT 개수(2로 해야 함)
  DW  224   ; 루트 디렉토리 영역의 크기(보통은 224엔트리로 한다)
  DW  2880   ; 드라이브 크기(2880섹터로 해야 함)
  DB  0xf0   ; 미디어 타입(0xf0로 해야 함)
  DW  9   ; FAT영역의 길이(9섹터로 해야 함)
  DW  18   ; 1트럭에 몇 개의 섹터가 있을까(18로 해야 함)
  DW  2   ; 헤드 수(2로 해야 함)
  DD  0   ; 파티션을 사용하지 않기 때문에 여기는 반드시 0
  DD  2880   ; 드라이브 크기를 한번 더 write
  DB  0,0,0x29  ; 잘 모르지만 이 값으로 해 두면 좋은 것 같다
  DD  0xffffffff  ; 아마, 볼륨 시리얼 번호
  DB  "HELLO-OS   "  ; 디스크 이름(11바이트)
  DB  "FAT12   "  ; 포맷 이름(8바이트)
  RESB 18    ; 우선 18바이트를 비어 둔다

; 프로그램 본체

entry:
  MOV  AX, 0   ; 레지스터 초기화
  MOV  SS,AX
  MOV  SP,0x7c00
  MOV  DS,AX
  MOV  ES,AX

  MOV  SI,msg
putloop:
  MOV  AL,[SI]
  ADD  SI, 1   ; SI에 1을 더한다
  CMP  AL,0
  JE  fin
  MOV  AH, 0x0e  ; 한 글자 표시 Function
  MOV  BX, 15   ; 칼라 코드
  INT  0x10   ; 비디오 BIOS 호출
  JMP  putloop
fin:
  HLT     ; 무엇인가 있을 때까지 CPU를 정지시킨다
  JMP  fin   ; Endless Loop

msg:
  DB  0x0a, 0x0a  ; 개행을 2개
  DB  "hello, world"
  DB  0x0a   ; 개행
  DB  0

  RESB 0x7dfe-$  ; 0x7dfe까지를 0x00로 채우는 명령

  DB  0x55, 0xaa

어셈블리가 생소한 분들은 어셈블리 공부를 쪼미 하시면 금방 이해 하실꺼 같군요

간단하게

mov ah, 0x0e 라는 뜻은
C로 보자면
ah = 0x0e 를 대입하라는 말과 같습니다.
; 라는 뜻은
C로 치면 // 와 같은 주석 처리 입니다.

이상 실습을 맞칩니다.
아따 어려운거~

'운영체제(OS)' 카테고리의 다른 글

nask 어셈블러에 기본명령어를 알아보자.  (0) 2009.08.28
OS 구조와 원리  (0) 2009.08.26

+ Recent posts