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