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

 어셈블리 코드를 천천히 살펴보자

 

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상에서 돌려보면

- 굳이에요 굳굳굳 문자열이 잘 출력되는걸 볼수 있다.

 

300x250

+ Recent posts