728x90
; haribote-ipl
; TAB=4

CYLS	EQU		10				; CYLS를 10으로 정의

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

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

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로
		MOV		CL,1
		ADD		DH,1
		CMP		DH,2
		JB		readloop		; DH < 2 read loop로
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH < CYLS read loop로

; 0xc200번지(hribote.sys)로 점프. 10실린더까지 다 읽어 로드되면 본프로그램 점프

		JMP		0xc200

error:
		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		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa
; haribote-os
; TAB=4

		ORG		0xc200			; harybote.sys가 로딩되는 메모리 주소

		MOV		AL,0x10			; VGA 그래픽스, 320x200x8bit 컬러
		MOV		AH,0x00
		INT		0x10
fin:
		HLT
		JMP		fin

 

 

현황

- 부트 섹터 완성

- 본 프로그램 실행하도록 수정

- 목표 : 실제 화면을 띄어 동작하는지 확인해보자

 

 

화면 모드로 전환하기

- 화면모드로 전환 : 비디오 BIOS의 AH = 0x00으로 할 수 있음

- 현재 설정에 따라 320x200x8bit 모드로 부팅됨

 

비디오 모드

- AH = 0x00

- AL = 모드

       0x03 : 16색 텍스트, 80x25

       0x12 : VGA 그래픽스, 640x480x4bit 컬러, 독자 영역 액세스

       0x13 : VGA 그래픽스, 320x200x8bit 컬러, 팩드 픽셀

       0x6a : 확장 VGA 그래픽스, 800x600x4bit 컬러 독자  영역 액세스(비디오카드에 의해 지원 x)

- 리턴값 : x

* AX = 누산기 레지스터

 

 

 

실행결과

- make run 한 결과 화면 모드로 전환되어 커서가 사라짐

 

300x250
728x90
; haribote-ipl
; TAB=4

CYLS	EQU		10				; CYLS를 10으로 정의

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

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

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로
		MOV		CL,1
		ADD		DH,1
		CMP		DH,2
		JB		readloop		; DH < 2 read loop로
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH < CYLS read loop로

; 0xc200번지(hribote.sys)로 점프. 10실린더까지 다 읽어 로드되면 본프로그램 점프

		JMP		0xc200

fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		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

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

복습

- 이전에 버퍼 세그먼트가 ES = 0x0820, BX =0으로 설정되어 데이터가 로드되는 지점이 0x8200 ~ 0x83ff번지가 됨

- 여기서 0x8000 ~ 0x81ff는 512바이트의 부트섹터 내용이 들어감

 

 

부트섹터에서 OS 본 프로그램 실행하기

- 부트 섹터 맨 앞이 0x8000 번지에 로드되도록 하여 읽어들인 상태

- 디스크를 메모리에 읽어들인 상태로 img의 0x4200(본체 어드레스)는 pc 메모리의 0x8000 + 0x4200 = 0xc200에 위치

 

 

ORG 명령

- 기계어가 실행시 PC 메모리의 어디에 로드 되어야 하는지를 nask에게 알림

- 이 프로그램들을 메모리의 어느 번지에 로드하도록 요청

 

 

부트섹터 완료 후 OS 본 프로그램으로 넘어가기

- ipl.nas 처리 후 next의 맨 아래에 0xc200으로 점프

- haribote.sys의 첫번째 데이터로 넘어감(바이너리 데이터로 haribote.sys의 실제 내용이 어디있는지확인함)

 

본 프로그램 동작

- ipl.nas에서 JMP 0xc200으로 현재 sys파일로 넘어옴

- org 0xc200을 만나 이제 0xc200 지점에서부터 로드하는걸로 설정

; haribote-os
; TAB=4

		ORG		0xc200			; 이 프로그램이 로딩되는 위치?
fin:
		HLT
		JMP		fin

 

make run

- make run 하면 부팅은 되는데 동작하는지는 잘모르겠다.

300x250
728x90

os 본프로그램(본체?) 만들기

- 이전에 만든 어셈블리코드는 부트섹터

- 부트섹터를 제외한 실제 프로그램을 구현해보자

=> HLT하는 단순 프로그램

- 이름은 haribote.nas => nask로 어셈블하여 haribote.sys 만들기

TOOLPATH = ../z_tools/
MAKE     = $(TOOLPATH)make.exe -r
NASK     = $(TOOLPATH)nask.exe
EDIMG    = $(TOOLPATH)edimg.exe
IMGTOL   = $(TOOLPATH)imgtol.com
COPY     = cp
DEL      = rm


default :
	$(MAKE) img


ipl.bin : ipl.nas Makefile
	$(NASK) ipl.nas ipl.bin ipl.lst

haribote.sys : haribote.nas Makefile
	$(NASK) haribote.nas haribote.sys haribote.lst

haribote.img : ipl.bin haribote.sys Makefile
	$(EDIMG)   imgin:../z_tools/fdimg0at.tek \
		wbinimg src:ipl.bin len:512 from:0 to:0 \
		copy from:haribote.sys to:@: \
		imgout:haribote.img


img :
	$(MAKE) haribote.img

run :
	$(MAKE) img
	$(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin
	$(MAKE) -C ../z_tools/qemu

install :
	$(MAKE) img
	$(IMGTOL) w a: haribote.img

clean :
	-$(DEL) ipl.bin
	-$(DEL) ipl.lst
	-$(DEL) haribote.sys
	-$(DEL) haribote.lst

src_only :
	$(MAKE) clean
	-$(DEL) haribote.img

메이크파일코드

- 부트섹터는 ipl.nas, 본 프로그램은 haribote.sys 로 출력

- 처음 512바이트는 ipl.bin으로 이후 영역에 haribote.sys 추가

- 출력 프로그램은 ipl.bin + haribote.sys = haribote.img

- make img 명령으로 파일 작성 완료

 

바이너리 에디터로 보기(어셈블리 코드와 매칭해서 보기)

- 맨 첫 두바이트는 매직 코드

- 다음 바이트는 DB 0x90

- 다음 바이트들은 "HARIBOTE"

- 다음 워드 DW 512 => 0x0200 => 표기는 00 02(리틀엔디언 방식)

...

 

본 프로그램은 어디에 있을까

- haribote.img에서 본 프로그램 haribote.sys 파일명은 0x002600 부근에서 보임

- 파일 내용은 0x004200이후에 나오는듯

 

본프로그램 동작 방법

1. 부트 섹터 로드

2. 부트섹터가 본프로그램 haribote.sys를 실행하면 됨

 

 

300x250
728x90

이번에 할일

이전의 과정으로 C0-H0-S2(0x8200)에서 C0-H0-S18섹터(~0x3aff) 까지 읽음

-> 이제 C0-H1-S1로 0xa400부터 읽음.

-> C0-H1-S18까지 읽고 다음 실린더 C1-H0-S1으로 넘어가자

-> 이를 반복해서 C9-H1-S18까지 읽자

 

 

1.5mb 플로피 디스크 구성

- 디스크 1장 : 80 실린더, 2헤드

- 실린더 1개 : 18 섹터

- 섹터 1개 : 512바이트

=> 총 1,440kb

 

 

; haribote-ipl
; TAB=4

CYLS	EQU		10				; CYLS를 10으로 정의

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

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

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로
		MOV		CL,1
		ADD		DH,1
		CMP		DH,2
		JB		readloop		; DH < 2 read loop로
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH < CYLS read loop로

fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		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

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

 

 

 

추가된 내용

1. 섹터 18까지 리드 루프

2. 섹터 18 넘어가면 섹터 =1, 헤더++, 헤더가 2인지 확인 => 헤더가 1이면 리드루프로

3. 섹터 18 넘고, 헤더도 2가 되면 => 헤더 = 0,  실린더++

4. 실린더가 10(CYLS)보다 작은 경우에만 read loop

5. 실린더가 10이되면 fin 레이블로 넘어가 종료

 

 

EQU 명령

- C언어의 #define과 동일

- EQU 는 equal의 약어

- CYLS EQU 10 => CYLS = 10

 

 

현황

- 부트섹터 코드 대부분 완성

- 10(실린더) x 2(헤더) x 18(섹터) x 512(바이트) = 184,320(바이트) = 180KB까지 읽을수 있게됨

- PC 메모리의 0x8200~0x34ffff는 디스크에서 읽은 데이터들로 꽉 차게됨

 

300x250
728x90

현재 코드

- 부트 섹터 생성 + 메시지 출력 + putloop 코드에 한번 진입하면 다음 섹터로 넘어감 + 플로피가 안읽히면 다시 시도

- 목표 : 18섹터 까지 읽도록 개선하자

 

 

; haribote-ipl
; TAB=4

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

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

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로



fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		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

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

 

 

수정된 부분

- retry 레이블에 JNC next와 next 레이블이 추가됨

 

JBE

- jump if below or equal

- CL이 18보다 같거나 작으면 readLoop로 진입

 

이 코드가 하는일

1. 섹터 이동

 - CL 섹터 번호

2. 번지 지정

 - ES 읽어낼 번지 

  * 0x20은 512/16으로 512를 16진수 표현

 => ES = ES + 0x20로 다음 번지 주소를 가리킴

 

 

정리해보자

1. 0x7c00(부트섹터)에서 로드 시작 -> entry로 점프

 

2. 레지스터들 초기화

2.1 레지스터 초기화

 ss 스텍세그먼트, ds 데이터세그먼트 0 입력

 sp 스택 포인터 0x7c00 입력

2.2 디스크 읽기 준비

 es 버퍼 어드레스 0x0820 읽을 데이터 주소

 (es가 0x0820인경우, 세그먼트 레지스터이므로 * 16 => 0x8200을 가리킴)

 ch 실린더 해더 0, 해드 0, 섹터 2 선택

 si 소스 인덱스 0, 실패 횟수 저장 

 

3. 디스크 읽기 및 에러 검사

3.1 인터럽트 준비

 AH = 0x02 디스크 읽기 모드 설정

 AL = 1 1번 섹터

 BX = 0 세그먼트 레지스터 0(주소 세부 조정용)

 DL = 0x00 0번 드라이브 -> 드라이브 A 설정

3.2 인터럽트 호출

 INT 0x13 위 인터럽트 관련 값에따라 동작 수행 -> 값읽기 수행

 에러가 안뜨면 next로 점프

3.3 next 구문

 버퍼 레지스터 주소를 0x0820 + 0x0020. 20씩 이동

 add cl,1 섹터 번호++, 다음 섹터번호 지정

 cl이 18번을 초과하면 아래의 fin으로 내려감

 

 

4. 에러 발생시

4.1 에러 발생시 내려가기

 

 에러 발생시 레지스터 0으로 초기화 후 드라이브 리셋 수행

 => 다시 retry 레이블로 점프

4.2 에러 횟수 5회 초과시

 error 레이블로 점프 및 load 에러 출력

 

 

haribote00c 정리

1. 부트 섹터 로드

2. 18번 섹터까지 값읽기

3. 에러 발생시 5번 반복. 횟수 초과시 에러 문자 출력

 

 

접근한 메모리 번지 범위

- C0-H0-S2 에서 C0-H0-S18까지 접근

- 섹터 1개당 512바이트 => 512 x 17 = 8,704바이트

=> 0x8200 ~ 0xa3ff번지까지 값이 읽혀짐

 

 

 

 

 

 

300x250
728x90
; haribote-ipl
; TAB=4

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HELLOIPL"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880				; 디스크 총섹터수
		DW		0xf0				; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880				; 드라이브 크기 한번더씀
		DB		0, 0, 0x29			; 필요하다고함
		DD		0xffffffff			; 볼륨 시리얼 번호
		DB		"HELLO-OS  "		; 디스크 이름
		DB		"FAT12   "			; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

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

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 

		MOV		SI,0			; 실패 횟수를 세는 레지스터
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		fin				; 에러 없으면 fin으로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry


fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		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

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"good i e yo you good good good"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

 

추가한 부분 harib00b

- 플로피 디스크가 읽지 못하는 경우 발생할수 있으므로 5번 정도 다시 읽도록 루프문 추가

 

 

JNC 명려어

- JUMP if not carry

- 위 코드에 에러가 발생하지 않으면(캐리가 없으면) fin을 호출하도록 사용

 

 

JAE

- jump if above or equal

- 같거나 크면 점프

 => SI가 5와 같거나 큰경우 에러 루틴으로 점프

 

 

INT 0x13

- AT-BIOS에 따르면 INT 0x13은 드라이브 리셋을 호출

 

300x250
728x90

 

; haribote-ipl
; TAB=4

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HELLOIPL"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880				; 디스크 총섹터수
		DW		0xf0				; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880				; 드라이브 크기 한번더씀
		DB		0, 0, 0x29			; 필요하다고함
		DD		0xffffffff			; 볼륨 시리얼 번호
		DB		"HELLO-OS  "		; 디스크 이름
		DB		"FAT12   "			; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

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

		MOV		SI,msg


; 추가된 부분

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 

		MOV		AH,0x02			; AH=0x02 :디스크 읽기
		MOV		AL,1			; 1섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 BIOS 추출
		JC		error




fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		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

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"good i e yo you good good good"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

버퍼 어드레스

- 디스크서 읽은 데이터를 메모리 어디다가 저장할지 나타내는 주소값

- 1개의 레지스터로 나타내자니 (16비트 컴퓨터에선) 0x0000 ~ 0xFFFF 밖에 표현하지 못함

 => 0 ~ 65,535번지(1번지당 1바이트)로 64KB밖에 사용하지 못한다는 예기

 * 32비트 컴퓨터에선 0x0000 0000 ~ 0xFFFF FFFF로 최대 4GB까지 다룰수 있으나. 16비트 컴터에선 불가

 

세그먼트 레지스터

- 16비트 컴퓨터에서 메모리 지정할때 사용하는 레지스터

ex. ES:BX 같은 것들

 

 

세그먼트 레지스터 사용 에시

-  MOV AL, [ES:BX] 

=> AL = ES * 16 + BX . AL레지스터에 다음 값이 대입됨

- 즉, ES로 대략적인 메모리 위치를 조절하고 BX로 세세하게 조정

 

 

16비트 컴퓨터의 메모리 주소 범위와 세그먼트 레지스터를 사용하여 확장한 주소 범위

- 16비트 컴퓨터 : 0x0000 ~ 0xFFFF => 64KB

- 16비트 컴퓨터 + 세그먼트 레지스터 

  ES도 0x0000 ~ 0xFFFF, BX도 0x0000 ~ 0xFFFF까지 가능하므로,

  => 64KB x 16 = 640 + 360 + 24 = 1024 => 1024KB = 1MB까지 주소 지정 가능해짐

* 64KB에서 세그먼트 레지스터 덕분에  1MB로 쓸수 있는 공간이 많이 커지긴 했다.

 

 

 

모든 주소와 세그먼트 레지스터

- 모든 메모리 주소는 항상 세그먼트 레지스터도 같이 지정해야함.

- 하지만 세그먼트 레지스터가 생략된 경우( [DS:숫자]) DS가 보통 0임.

- 예시

MOV AL, [SI] => MOV AL, [DS:SI]

MOV CX,[1234] => MOV CX, [DS:1234]

* 위 경우 DS가 0이라면 ? => MOV CX, [1234] => MOV CX, [0x04d2] => 0x04d2번지의 값을 CX에 대입하라

* 위 경우 DS가 0x00ff라면? => 16 x 0x00ff + 1234(=0x04d2) = 16 x 255 + 1234 = 4080 + 1234 = 5314 = 0x14c2

=> MOV CX, [0x14c2]  : 0x14c2번지에 존재하는 값을 CX에다가 대입하라

 

 

 

 

 

 

 

 

300x250
728x90
; haribote-ipl
; TAB=4

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HELLOIPL"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880				; 디스크 총섹터수
		DW		0xf0				; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880				; 드라이브 크기 한번더씀
		DB		0, 0, 0x29			; 필요하다고함
		DD		0xffffffff			; 볼륨 시리얼 번호
		DB		"HELLO-OS  "		; 디스크 이름
		DB		"FAT12   "			; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

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

		MOV		SI,msg


; 추가된 부분

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 

		MOV		AH,0x02			; AH=0x02 :디스크 읽기
		MOV		AL,1			; 1섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 BIOS 추출
		JC		error




fin:
		HLT						; CPU 정지 시킴
		JMP		fin				; 무한 루프

error:
		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

msg:
		DB		0x0a, 0x0a		; 줄바꿈 문자 2개
		DB		"good i e yo you good good good"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

IPL

-초기 프로그램 로더 Initial Progrm Loader

-이전에 만든 부트섹터

- 그러나 프로그램을 로드하지 않음

 

 

하리보테 OS

- 앞으로 만들 운영체제 이름

- 하리보테란? 영화에서 겉에 보이는 바위나 건물, 속으로 비어있고 가자인 것들

- 하리보테 OS 겉보기엔 OS이지만 속은 텅빈 천천히가자는 의미

 

 

 

하리보테 OS 시작하기

- 초기 512바이트는 부트섹터

- 다음 512바이트 정리하자

- 아래의 코드는 추가된 부분들

 

 

 

 

JC 명령어

- jumpy if carry

 => 캐리가 발생하면(= 캐리 플래그가 1이면) 점프하라

 

INT 0x13은 무엇일까? (AT-BIOS 의 인터럽트 문서 참고)

- 디스크로부터 읽기, 디스크에 쓰기, 섹터 검사 및 찾기

  - AH = 0x02 (읽을때)

  - AH = 0x03 (쓸떄)

  - AH = 0x04 (검사할떄)

  - AH = 0x0C (찾을떄)

  - AL = 처리할 섹터 수(연속된 섹터 처리 간으)

  - CH = 실린더 번호 & 0xFF

  - CL = 섹터 번호(bit 0-5) | (실린더 번호  & 0x300) >> 2

  - DH = 헤드 번호

  - DL = 드라이브번호

  - ES:BX = 버퍼 어드레스(검사 혹은 찾기시 사용 x)

  - 리턴값 : 

   => FLAGS.CF == 0 : 에러 없음, AH == 0

   => FLAGS.CF == 1 : 에러 있음, AH에 에러 코드(리셋 기능과 같음)

 

 

현재 코드 상의 인터럽트와 의미

- INT 0x13 번 인터럽트가 발생했을때 AH = 0x02 => 디스크 읽기 수행

- FLAGS.CF 캐리 플레그 -> 0x13 인터럽트(함수)가 수행중 에러가 발생하면 캐리 플래그 1,  에러 없으면 캐리플래그 0

 

캐리 플래그

- CPU의 상태를 나타내기 위한 레지스터 중 1개,

- 플래그 : 1비트밖에 저장하지 못하는 레지스터로. 들어 올리거나 내리는 두가지 경우밖에 존재하지 않으므로 플래그라 함

 

 

인터럽트시 필요한 값들

- CH, CL, DH, DL에 갑이 입력되어 있어야 함

- 현재 AH = 0x02로 인터럽트 발생시 디스크를 읽기 가 호출됨. 하지만 어디를 해야할지 모름

- CH 실린더 번호, CL 섹터 번호, DH 헤드 번호, DL 드라이브 번호

 

 

 

플로피 디스크 구조

- 실린더(원통) : 큰 원(0~79번까지 80개 존재)

- 헤드 (자기헤드): 집게같이 생긴거 - 읽기용 헤드(위의꺼 0번), 쓰기용 헤드(아래꺼 1번)로 2가지

- 섹터 :  실린더와 헤드를 지정하면 데이터를 쓰거나 읽을수 있으나 너무 많아 나눔.

            피자조각을 나눈 조각 같은거 1 ~ 18번까지 18개 존재. 하나의 섹터당 512바이트 저장 가능

- 플로피 디스크의 크기 = 80 x 2 x 18 x 512(바이트) = 1,440KB = 1.4MB 플로피 디스크다

 

- 아래의 그림은 1.4 mb 짜리 플로피 디스켓

https://www.alamy.com/stock-photo-floppy-disk-14mb-15840692.html

 

 

 

우리의 경우 인터럽트시 무엇을 읽을까?

- MOV CH, 0 => 실린더 번호 0번에서의

- MOV DH, 0 => 헤드 번호 0번의

- MOV CL, 2 => 2번 섹터에서

- MOV DL, 0x00 => 0번 드라이브(플로피 디스켓이 입력되는 A디스크)

=> IPL은 C0-H0-S1에 존재. 다음에는 C0-H0-S2를 읽음

 

 

 

300x250
728x90

Makefile

- 빌드 규칙을 정리한 파일

- make 명령을 주면 정해진 규칙대로 수행하여 출력 파일 생성

 

 

helloos5 구조

- 기존의 nas 파일, 부트섹터만 만든 bin파일, make.bat, 빌드를 위한 Makefile로 구성

 

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

 

Makefile 빌드 규칙 예제

- make -r ipl.bin

  => 명령을 입력하면 Makefile이 아래의 규칙을 수행하여 ipl.bin과 ipl.lst 출력

- ipl.bin : ipl.nas Makefile

  => ipl.bin을 빌드하기 위해 ipl.nas와 Makefile이 필요 (의존 관계 설명)

- 나머지 내용들도 이와 같이 빌드 수행

 

 

Make 명령 실행 결과

- 위 작성 규칙대로 ipl.bin과 ipl.lst가 생성됨

 

이미지도 만들자

- make -r helloos.img

 => 규칙대로 helloos.img 파일이 출력됨

 

Makefile 명령 정의하기

- 빌드 규칙으로 쉽게 빌드했으나 다 입력하기 힘듬

=> 명령(커멘드) 정의를 통해 자동화 하자

 

커맨트로 이미지 쉽게 만들기

- helloos.img를 지우고, make img 입력

=> make img 명령 규칙에 따라 helloos.img 생성

 

 

나머지 규칙

- make run : img 생성 후 실행

 * run 하기전에 bash 셀인 경우 copy 가아니라 cp로 변경해야함! 별도 경로 에러도 고치자

- make install : img 생성후 플로피디스켓에 저장

- make clean : img 만드는데 사용한 bin파일과 lst 파일 삭제

 

 

make run 결과

- qemu 상에서 잘 부팅되고 있음

300x250
728x90
; hello-os---------------------------------------------------------
; TAB=4

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HELLOIPL"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880				; 디스크 총섹터수
		DW		0xf0				; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880				; 드라이브 크기 한번더씀
		DB		0, 0, 0x29			; 필요하다고함
		DD		0xffffffff			; 볼륨 시리얼 번호
		DB		"HELLO-OS  "		; 디스크 이름
		DB		"FAT12   "			; 포멧이름
		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		"good i e yo you good good good"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

; 부트섹터 이외 부분에 적을 내용들

		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	4600
		DB		0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
		RESB	1469432

 

JMP entry

- entry가 0x7c50이면 => JMP 0x7c50과 동일

- 0x7c50 번지로 점프

 

MOV SI, msg

- SI 레지스터에 msg 레이블의 주소를 할당

- msg 레이블이 0x7c74 이라면 => SI = 0x7c74

 

 

MOV AL, [SI]

- AL 레지스터에 소스인덱스 SI가 가리키는 값을 저장

 -> c언어로 표현하면, AL = *SI

 ex.  SI = 0x50이고 0x50번지에 0x01이 저장되어있음 -> AL 레지스터에 0x01이 대입됨

- 만약 MOV AL, SI 라면 => AL = SI와 동일

 ex. 위와 동일한 경우 AL 레지스터에 0x50이 대입됨

 

 

 

MOV {BYTE | WORD | DWORD}의 경우

- MOV BYTE [678], 123

 => 메모리 678번지에 123를 바이트로 기억

- MOV WORD [678], 123

 => 메모리 678번지에 123을 워드로 기억 

 

 

워드, 더블워드, 쿼드워드 공간의 차이

 

 

 

덧셈 명령 ADD

- ADD SI, 1

 => SI = SI + 1

 

 

비교 명령 CMP

- CMP AL, 0 => if (AL == 0)

- ex.

   CMP AL, 0

   JE fin

=> if (AL == 0)

     {

         goto fin;

      }

 

 

인터럽트 명령 INT

- INT 주소

ex. INT 0x10 => 0x10에 존재하는 함수를 호출(여기선 비디오 BIOS 호출 관련 함수)

 

 

컴퓨터 정지 명령 HLT

- CPU를 대기상태로 만듬 -> 외부 변화 있을시 다시 실행됨

 

 

ORG 0x7c00. 프로그램 시작점을 0x7c00으로 설정한 이유 1

- 컴퓨터는 매우 큰 메모리공간 가짐. 마음대로 시작점을 설정하면 동작 x

- 0xf0000에는 바이오스가 존재 -> 사용 불가

- 메모리맵 : 메모리의 영역을 나타내는 지도

 

 

IBM PC AT 호환 기종 메모리 맵

- 메모리 ,바이오스, 그래픽 등 관련 주소에 대한 정보

- IBM 엔지니어가 메모리 주소 지정

- 남밗님의 자료 : http://egloos.zum.com/nambaxa/v/657469

 

 

 IBM PC AT 호환기종의 메모리 맵핑

- PCI 장치 혹은 PC에 장착하는 카드를 사용할 때, 각 장치가 메모리에 맵핑되는 상태를 설명합니다.
- 0x00000000 - 0x0009ffff : RAM
- 0x000a0000 - 0x000bffff : 비디오 카드 접근 영역
- 0x000c0000 - 0x000c7fff : 비디오 BIOS
- 0x000c8000 - 0x000dffff : 각종 카드의 ROM 영역
- 0x000d0000 - 0x000dffff 영역은 대부분 비어 있다
- 0x000e0000 - 0x000effff : 확장 BIOS
- 0x000f0000 - 0x000fffff : BIOS
- 0x00100000 - 0x00efffff : RAM
- 0x00f00000 - 0x00ffffff : RAM 혹은 ISA 홀(BIOS의 설정에 의해서 결정될 수 있다)
    286의 경우는, 0x00fffff0로부터의 16바이트에 리셋트 점프 명령이 있을 수도 있다
- 0x01000000 - 메모리의 끝 : RAM
- 메모리의 끝 - 0xffffffef : PCI 장치등의 메모리 맵핑 I/O에 이용 가능한 영역
- 0xfffffff0 - 0xffffffff : 386이후에서는 여기에 리셋트 점프 명령이 있다


소프트웨어에 따른 용도 구분

- 0x00000000 - 0x000003ff : 리얼모드용 인터럽트 벡터
- 물론 IDT를 변경하면 변경할 수 있지만 기본적으로는 이 주소가 사용된다
- 0x00000300 - 0x000003ff는 BIOS용 스택
- 0x00000400 - 0x000004ff : BIOS가 사용하는 영역
- 0x00007c00 - 0x00007dff : 부트섹터가 로딩되는 주소
- 0x0009fc00 - 0x0009ffff : ACPI 영역

 

 

 

ORG 0x7c00. 프로그램 시작점을 0x7c00으로 설정한 이유 2

- 0x00007c00 ~ 0x00007dff 가 부트 섹터의 어드레스이기 때문

- 부트 섹터가 아닌 다른 곳을 시작점으로 하면 오작동함

 

 

부트 섹터만 nask로 만들기 (helloos4)

- 앞으로는 nask로 512바이트의 부트섹터만 만듬

 1. helloos.nas에서 뒷부분 제거. 이름을 ipl.nas로 변경

   ->기존의 helloo.nas의 프로그램 영역이 ipl.nas에서 제거됨

 2. asm.bat을 수정하여 실행파일 ipl.bin과 리스트 ipl.lst가 출력되도록 수정

  * 리스트 파일 : 어떤 명령이 어느 기계어로 번역되었는지 확인 가능 

수정된 asm.bat 좌측. 기존의 파일 우측
ipl.lst

 

- 나머지는 디스크 이미지 툴로 만들기

 1. makeimg.bat 작성

 2. maikeimg.bat은 ipl.bin을 부트섹터로 하여 디스크 이미지  helloos.img 생성

 

 

 

 

 

 

300x250

+ Recent posts