; 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에다가 대입하라
'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글
os만들기 - 13. 18섹터 까지 읽어보기 (0) | 2020.08.01 |
---|---|
os만들기 - 12. 에러 발생시 다시 읽기 (0) | 2020.08.01 |
os만들기 - 10. make IPL (0) | 2020.08.01 |
os만들기 - 9. Makefile로 빌드 자동화 (0) | 2020.08.01 |
os만들기 - 8. 어셈블리 명령어들과 부트섹터 이미지 생성 (0) | 2020.08.01 |