플로피 디스크에서 512바이트까지가 부트섹터였는데
nask로 부트섹터 만들고, 나머지는 이미지 툴로 만듬
기존에 어셈블 코드
asm.bat
..\z_tools\nask.exe helloos.nas helloos.img
을 bin과 lst (기계어로 번역되는 명령 목록) 출력되도록 수정
..\z_tools\nask.exe ipl.nas ipl.bin ipl.lst
making.bat
ipl.bin으로 helloos.img 만듬
edimg.exe로 ipl.bin 먼저 놓고 helloos.img 이미지 출력
..\z_tools\edimg.exe imgin:../z_tools/fdimg0at.tek wbinimg src:ipl.bin len:512 from:0 to:0 imgout:helloos.img
ipl.bin에는 부트섹터내용만 들어가므로
helloos3의 맨 끝에 부트섹터외는 제외되어있음.
기존 helloos3 | ipl.nas |
;hello-os ;TAB ORG 0x7c00 ;메모리내 어디에 로딩되는지 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 ;한문자 표시기능 MOV BX,15 ;컬러코드 INT 0x10 ;비디오BIOS호출 JMP putloop fin: HLT ;cpu정지 JMP fin ;무한루프 msg: DB 0x0a, 0x0a ;줄바꿈문자2개 DB "hello, world" DB 0x0a ;줄바꿈문자2개 DB 0 RESB 0x7dfe-$ ;0x7dfe까지 0x00으로 채우기 DB 0x55, 0xaa ; boot sector 이외부분 기술 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 4600 DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00 RESB 1469432 |
; 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 |
부트섹터 이외부분이 제거되어있는데 왜 정상동작하는지는 모르겠다.
거의 0으로 채우는거긴했는데
생각해보니 msg 맨 뒷부분에 0x7fde까지 0으로 채우고 마지막에 0x55,0xaa를 넣어놧구나
512바이트 맨 마지막에 0x55,0xaa가 있으면 부팅가능 디스크로 판단했다고 정리했었다.

메이크파일 만들기
Makefile
# 파일 생성 규칙
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
make -r helloos.img 로
bin과 lst 생성 후 img까지 생성

make file 개선
make run만 해주면
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
img :
..\z_tools\make.exe -r helloos.img
asm:
..\z_tools\make.exe -r ipl.bin
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
day02.zip
0.00MB
'컴퓨터과학 > os' 카테고리의 다른 글
OS30 - 6. c언어 사용, 화면 만들기 (0) | 2024.04.05 |
---|---|
OS30 - 5. ipl 만들기, c언어 진입 (0) | 2024.04.05 |
OS30 - 3. 어셈블리 다루기 (0) | 2024.04.05 |
OS30 - 2. 어셈블리 시작 (0) | 2024.04.04 |
OS30 - 1. 시작 : 바이너리 에디터로 부팅 이미지 만들기 (0) | 2024.04.04 |