728x90

 

; 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에다가 대입하라

 

 

 

 

 

 

 

 

300x250

+ Recent posts