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 |