; 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가 출력되도록 수정
* 리스트 파일 : 어떤 명령이 어느 기계어로 번역되었는지 확인 가능


- 나머지는 디스크 이미지 툴로 만들기
1. makeimg.bat 작성
2. maikeimg.bat은 ipl.bin을 부트섹터로 하여 디스크 이미지 helloos.img 생성

'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글
os만들기 - 10. make IPL (0) | 2020.08.01 |
---|---|
os만들기 - 9. Makefile로 빌드 자동화 (0) | 2020.08.01 |
os만들기 - 7. 어셈블리어 기본 명령어와 레지스터 (0) | 2020.08.01 |
os만들기 - 6. 어셈블리어 시작하기 (0) | 2020.08.01 |
os만들기 - 5. 첫 어셈블러 고치기 (0) | 2020.07.30 |