; 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
어셈블리 코드를 천천히 살펴보자
ORG 명령
- origin
- 시작점을 NASK 어셈블러에게 알려줌 -> 0x07c00번지서 시작
JMP 명령
- Jump 명령. c언어의 goto와 동일하게 레이블로 이동
- 레이블 예시
entry:, putloop:, fin:
- JUMP putloop -> putloop 레이블로 이동해서 문자 출력
MOV 명령어
- 대입 연산
- 프로그래밍 언어에서 = 와 동일
- 예시
1. MOV AX, 0 => 값 0을 AX 레지스터에 대입(저장)
2. MOV SS, AX => AX레지스터의 값을 SS 레지스터에 데입하라
레지스터
- CPU내 기억 장치. 변수 공간
- 예시
AX : accumulator 누산기
CX : Counter 가산기
DX : 데이터
BX : 베이스
SP : 스택 포인터 stack poitner
BP : 베이스 포인터 Base Pointer
SI : 소스(읽기) 인덱스 source index
DI : 목적지(쓰기) 인덱스 destination index
8비트 레지스터
- 16비트 레지스터 X의 의미 : AX, CX에서 X는 확장 -> 8비트에서 16비트로 확장되었기 때문
- CPU 8비트 레지스터 예시
AL : 누산기 로
CL : 카운터 로
DL : 데이터 로
BL : 베이스 로
AH : 누산기 하이
CH : 카운터 하이
DH : 데이터 하이
BL : 베이스 하이
- 16비트 레지스터는 로 공간과 하이 공간으로 구성됨
=> 예시 : AX = AH + AL
32비트 레지스터
- 16비트 레지스터앞에 E가 추가
- 예시 : EAX, ECX, EDX ...
세그먼트 레지스터
- 16비트
- 종류
ES : 엑스트라 세그먼트
CS : 코드 세그먼트
SS : 스택 세그먼트
DS : 데이터 세그먼트
FS : 엑스트라 세그먼트 2
GS : 엑스트라 세그먼트 3
어셈블리 코드 돌려보기
- 경로 : make_os\tolset\helloos3
- 위 어셈블리어를 nask로 컴파일 후 qemu상에서 돌려보면
- 굳이에요 굳굳굳 문자열이 잘 출력되는걸 볼수 있다.
'컴퓨터과학 > 컴퓨터, OS' 카테고리의 다른 글
os만들기 - 9. Makefile로 빌드 자동화 (0) | 2020.08.01 |
---|---|
os만들기 - 8. 어셈블리 명령어들과 부트섹터 이미지 생성 (0) | 2020.08.01 |
os만들기 - 6. 어셈블리어 시작하기 (0) | 2020.08.01 |
os만들기 - 5. 첫 어셈블러 고치기 (0) | 2020.07.30 |
os만들기 - 4. 어셈블러 체험 (0) | 2020.07.30 |