728x90

 

 

 

 

한계를 모르면

형채가 없는 애가 된다.

학원 이것 저곳 다녀온 사람은

자기가 뭘 좋아하는지도 못하는지도 모른다.

 

사람이 날지 못하지만 비행기를 만들어냈다.

시험 쳐서 삼성 못들어가지만 강의잘해서 들어갔다

-> 한계 안에서 가능성을 찾아낸다.

 

 

 

 

 

되게 사회생활을 못하는 편인데

 

친절하게 대하던 사람도 멀어지는걸 보면

 

화가 치밀고 억울할때가 많더라

 

아마 그만큼 잘못한게 많았기 때문인듯하다.

 

처음에는 잘 몰라 원망에 빠지기도 혼란스러울 때가 많았다.

 

지금은 내가 계속 놓치는 부분이 많은건 알지만 잘 파악은 못하고 있다 하지만 잘못된 점들을 고치는게 참 힘들다.

 

 

 

 

 

내가 믿을수 있는 사람인지 잘 모르겠지만

 

믿을만한 사람을 알아보는 방법이라고 한다.

 

 

물에 금을 넣어서 금이 순금인지 알수 있다고 한다.

 

사람도 어떤 물에 넣으면 알수 있을까?

 

1. 문제가 생겼을때 어떻게 자기를 용서하는지 봄

* 용서받고 왔다고 말하는 사람도 있다고 함 => 마음대로 용서받고 다닌다.

 

2. 문제를 해석하는 방식

* 긍정적으로 해석하는 사람 => 모든 사람에게 긍정적 ? 본인에게만 긍정적으로 해석하는 경우 => 문제시 혼자 괜찬음

 

 

믿음은 주어지는게 아니라 잘 만들어가는 감정

 

 

 

 

 

나도 남한태 배신당한 기분이 자주 들곤하는데

 

남도 나한태 배신당한 기분이 자주들것같다.

 

그래도 혼자 있어야될떄도 필요해

 

 

 

 

 

 

 

 

내가 좋아하는 정우열 선생님의 세바시 강의

 

정우열 선생님이 환자를 대할때 드는 기분

 

사람은 형편없다.

 

형편없으니 너무 높은 목표를 지키려고 힘들어 하진 말자

 

 

 

 

너무 참고 참다가 터지게 두지 말자

 

 

보다가 인상적인 댓글

 

자신들의 무능을 남탓으로 돌리는 못된 어른들을 자주 보긴 했지만 왜그런지 잘 몰랐는데

조금 이해하는데 도움되는 댓글. 

자기 감정도 생각안하는데 남의 감정은 생각하겠는가.

 

자기 감정 생각해도 남의 감정을 생각못하는 사람도 있지만본인

 

 

하지만 이 댓글에 약간의 변명을 달자면

자기를 돌아볼 여유없던 분들이 많아서 그런것 같다.

 

개인적으로 요즘 온 나라가 지금처럼 청년이 힘들다고 토닥여 주고 있지만

과거든 앞으로든 지금처럼 청년 세대를 떠밭들여주거나 잘 챙겨주는 시기는 오지는 않을것 같다.

 

우리 세대에 비해 우리 윗세대들은 어떤가

미운것도 많지만 이해되는 부분도 많다.

 

 

 

 

 

 

 

 

 

학교를 다닐때 나를 엄청나게 뒷담화 하는 교수가 있다고 들었다.

 

 

한 사람만 그 사실을 알려준게 아니라 다른 교수님을 포함해서 여러 학생들이 그렇게 말했으니

그 교수가 나를 싫어하는건 알았지만, 뒷담화를 많이 하고 다닐줄은 몰랐었다.

 

 

교수라는 분이 일개 대학원생을 뒷담화하고 다닐만큼 미웠는지 왜 그렇게까지 미워했는지는 

영상을 보면서 조금은 이해됬다.

 

 

 

 

 

 

 

 

 

강요하는 사람 강요를 받는 사람

 

가끔 가다보면 강요를 받는 상황이 생기는데

 

그럴때마다 강요하는 사람이 정말 싫다.

 

 

그런데 나도 원망할 처지는 안되는게

 

다른 사람들에게 특히 공부방식에서 강요를 자주하다보니

 

나도 강요가 심한 사람이구나 알게되드라 으앜

 

 

 

 

300x250

'미분류' 카테고리의 다른 글

2020-08-02  (0) 2020.08.02
2020.07 학습 후기 및 8월 계획  (0) 2020.08.02
카이스트 vr-ar  (0) 2020.08.01
2020-07-31  (0) 2020.07.31
2020-07-30  (0) 2020.07.31
728x90

이번에 할일

이전의 과정으로 C0-H0-S2(0x8200)에서 C0-H0-S18섹터(~0x3aff) 까지 읽음

-> 이제 C0-H1-S1로 0xa400부터 읽음.

-> C0-H1-S18까지 읽고 다음 실린더 C1-H0-S1으로 넘어가자

-> 이를 반복해서 C9-H1-S18까지 읽자

 

 

1.5mb 플로피 디스크 구성

- 디스크 1장 : 80 실린더, 2헤드

- 실린더 1개 : 18 섹터

- 섹터 1개 : 512바이트

=> 총 1,440kb

 

 

; haribote-ipl
; TAB=4

CYLS	EQU		10				; CYLS를 10으로 정의

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

entry:
		MOV		AX,0			; 레지스터 초기화
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로
		MOV		CL,1
		ADD		DH,1
		CMP		DH,2
		JB		readloop		; DH < 2 read loop로
		MOV		DH,0
		ADD		CH,1
		CMP		CH,CYLS
		JB		readloop		; CH < CYLS read loop로

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		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

 

 

 

추가된 내용

1. 섹터 18까지 리드 루프

2. 섹터 18 넘어가면 섹터 =1, 헤더++, 헤더가 2인지 확인 => 헤더가 1이면 리드루프로

3. 섹터 18 넘고, 헤더도 2가 되면 => 헤더 = 0,  실린더++

4. 실린더가 10(CYLS)보다 작은 경우에만 read loop

5. 실린더가 10이되면 fin 레이블로 넘어가 종료

 

 

EQU 명령

- C언어의 #define과 동일

- EQU 는 equal의 약어

- CYLS EQU 10 => CYLS = 10

 

 

현황

- 부트섹터 코드 대부분 완성

- 10(실린더) x 2(헤더) x 18(섹터) x 512(바이트) = 184,320(바이트) = 180KB까지 읽을수 있게됨

- PC 메모리의 0x8200~0x34ffff는 디스크에서 읽은 데이터들로 꽉 차게됨

 

300x250
728x90

현재 코드

- 부트 섹터 생성 + 메시지 출력 + putloop 코드에 한번 진입하면 다음 섹터로 넘어감 + 플로피가 안읽히면 다시 시도

- 목표 : 18섹터 까지 읽도록 개선하자

 

 

; haribote-ipl
; TAB=4

		ORG		0x7c00			; 메모리 안에서 로딩되는 곳

; 아래는 표준 FAT12 포맷 플로피 디스켓을 위한 내용들

		JMP		entry
		DB		0x90
		DB		"HARIBOTE"		; 부트섹터 이름. 마음대로해도 ok
		DW		512				; 1섹터 크기(바이트 단위, 512)
		DB		1				; 클러스터 크기(1로 해야됨)
		DW		1				; 예약된 섹터수 
		DB		2				; 디스크 FAT 테이블 수
		DW		224				; 루트 디렉토리 엔트리 수 (보통 224엔트리)
		DW		2880			; 디스크 총섹터수
		DB		0xf0			; 미디어 타입
		DW		9				; 하나의 FAT 테이블 섹터 수
		DW		18				; 1트랙에 몇 색터가있는지
		DW		2				; 헤드의 수
		DD		0				; 파티션 없으므로 0
		DD		2880			; 드라이브 크기 한번더씀
		DB		0,0,0x29		; 필요하다고함
		DD		0xffffffff		; 볼륨 시리얼 번호
		DB		"HARIBOTEOS "	; 디스크 이름
		DB		"FAT12   "		; 포멧이름
		RESB	18				; 18바이트 남김

; 프로그램 본체

entry:
		MOV		AX,0			; 레지스터 초기화
		MOV		SS,AX
		MOV		SP,0x7c00
		MOV		DS,AX

; 디스크 읽기

		MOV		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 
readloop:
		MOV		SI,0			; 실패 횟수를 세는 레지스터
		
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		next			; 에러가 없으면 next로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry
next:
		MOV		AX,ES			; 어드레스를 0x200 더함
		ADD		AX,0x0020
		MOV		ES,AX			; ADD ES,0x020이 없어서 이렇게 함
		ADD		CL,1			; CL에 1 더함
		CMP		CL,18			; CL과 18 비교
		JBE		readloop		; CL <= 18 readloop로



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		"load error"
		DB		0x0a			; 줄바꿈
		DB		0

		RESB	0x7dfe-$		; 나머지칸 0채우기

		DB		0x55, 0xaa

 

 

수정된 부분

- retry 레이블에 JNC next와 next 레이블이 추가됨

 

JBE

- jump if below or equal

- CL이 18보다 같거나 작으면 readLoop로 진입

 

이 코드가 하는일

1. 섹터 이동

 - CL 섹터 번호

2. 번지 지정

 - ES 읽어낼 번지 

  * 0x20은 512/16으로 512를 16진수 표현

 => ES = ES + 0x20로 다음 번지 주소를 가리킴

 

 

정리해보자

1. 0x7c00(부트섹터)에서 로드 시작 -> entry로 점프

 

2. 레지스터들 초기화

2.1 레지스터 초기화

 ss 스텍세그먼트, ds 데이터세그먼트 0 입력

 sp 스택 포인터 0x7c00 입력

2.2 디스크 읽기 준비

 es 버퍼 어드레스 0x0820 읽을 데이터 주소

 (es가 0x0820인경우, 세그먼트 레지스터이므로 * 16 => 0x8200을 가리킴)

 ch 실린더 해더 0, 해드 0, 섹터 2 선택

 si 소스 인덱스 0, 실패 횟수 저장 

 

3. 디스크 읽기 및 에러 검사

3.1 인터럽트 준비

 AH = 0x02 디스크 읽기 모드 설정

 AL = 1 1번 섹터

 BX = 0 세그먼트 레지스터 0(주소 세부 조정용)

 DL = 0x00 0번 드라이브 -> 드라이브 A 설정

3.2 인터럽트 호출

 INT 0x13 위 인터럽트 관련 값에따라 동작 수행 -> 값읽기 수행

 에러가 안뜨면 next로 점프

3.3 next 구문

 버퍼 레지스터 주소를 0x0820 + 0x0020. 20씩 이동

 add cl,1 섹터 번호++, 다음 섹터번호 지정

 cl이 18번을 초과하면 아래의 fin으로 내려감

 

 

4. 에러 발생시

4.1 에러 발생시 내려가기

 

 에러 발생시 레지스터 0으로 초기화 후 드라이브 리셋 수행

 => 다시 retry 레이블로 점프

4.2 에러 횟수 5회 초과시

 error 레이블로 점프 및 load 에러 출력

 

 

haribote00c 정리

1. 부트 섹터 로드

2. 18번 섹터까지 값읽기

3. 에러 발생시 5번 반복. 횟수 초과시 에러 문자 출력

 

 

접근한 메모리 번지 범위

- C0-H0-S2 에서 C0-H0-S18까지 접근

- 섹터 1개당 512바이트 => 512 x 17 = 8,704바이트

=> 0x8200 ~ 0xa3ff번지까지 값이 읽혀짐

 

 

 

 

 

 

300x250
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		AX,0x0820
		MOV		ES,AX
		MOV		CH,0			; 실린더 0
		MOV		DH,0			; 헤드 0
		MOV		CL,2			; 섹터 2 

		MOV		SI,0			; 실패 횟수를 세는 레지스터
retry:
		MOV		AH,0x02			; AH=0x02 : 디스크 읽기
		MOV		AL,1			; 1 섹터
		MOV		BX,0
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 디스크 바이오스 호출
		JNC		fin				; 에러 없으면 fin으로
		ADD		SI,1			; SI에 1더하기
		CMP		SI,5			; SI와 5비교
		JAE		error			; SI >= 5 이면 에러로
		MOV		AH,0x00
		MOV		DL,0x00			; A 드라이브
		INT		0x13			; 드라이브 리셋
		JMP		retry


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

 

추가한 부분 harib00b

- 플로피 디스크가 읽지 못하는 경우 발생할수 있으므로 5번 정도 다시 읽도록 루프문 추가

 

 

JNC 명려어

- JUMP if not carry

- 위 코드에 에러가 발생하지 않으면(캐리가 없으면) fin을 호출하도록 사용

 

 

JAE

- jump if above or equal

- 같거나 크면 점프

 => SI가 5와 같거나 큰경우 에러 루틴으로 점프

 

 

INT 0x13

- AT-BIOS에 따르면 INT 0x13은 드라이브 리셋을 호출

 

300x250
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
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

IPL

-초기 프로그램 로더 Initial Progrm Loader

-이전에 만든 부트섹터

- 그러나 프로그램을 로드하지 않음

 

 

하리보테 OS

- 앞으로 만들 운영체제 이름

- 하리보테란? 영화에서 겉에 보이는 바위나 건물, 속으로 비어있고 가자인 것들

- 하리보테 OS 겉보기엔 OS이지만 속은 텅빈 천천히가자는 의미

 

 

 

하리보테 OS 시작하기

- 초기 512바이트는 부트섹터

- 다음 512바이트 정리하자

- 아래의 코드는 추가된 부분들

 

 

 

 

JC 명령어

- jumpy if carry

 => 캐리가 발생하면(= 캐리 플래그가 1이면) 점프하라

 

INT 0x13은 무엇일까? (AT-BIOS 의 인터럽트 문서 참고)

- 디스크로부터 읽기, 디스크에 쓰기, 섹터 검사 및 찾기

  - AH = 0x02 (읽을때)

  - AH = 0x03 (쓸떄)

  - AH = 0x04 (검사할떄)

  - AH = 0x0C (찾을떄)

  - AL = 처리할 섹터 수(연속된 섹터 처리 간으)

  - CH = 실린더 번호 & 0xFF

  - CL = 섹터 번호(bit 0-5) | (실린더 번호  & 0x300) >> 2

  - DH = 헤드 번호

  - DL = 드라이브번호

  - ES:BX = 버퍼 어드레스(검사 혹은 찾기시 사용 x)

  - 리턴값 : 

   => FLAGS.CF == 0 : 에러 없음, AH == 0

   => FLAGS.CF == 1 : 에러 있음, AH에 에러 코드(리셋 기능과 같음)

 

 

현재 코드 상의 인터럽트와 의미

- INT 0x13 번 인터럽트가 발생했을때 AH = 0x02 => 디스크 읽기 수행

- FLAGS.CF 캐리 플레그 -> 0x13 인터럽트(함수)가 수행중 에러가 발생하면 캐리 플래그 1,  에러 없으면 캐리플래그 0

 

캐리 플래그

- CPU의 상태를 나타내기 위한 레지스터 중 1개,

- 플래그 : 1비트밖에 저장하지 못하는 레지스터로. 들어 올리거나 내리는 두가지 경우밖에 존재하지 않으므로 플래그라 함

 

 

인터럽트시 필요한 값들

- CH, CL, DH, DL에 갑이 입력되어 있어야 함

- 현재 AH = 0x02로 인터럽트 발생시 디스크를 읽기 가 호출됨. 하지만 어디를 해야할지 모름

- CH 실린더 번호, CL 섹터 번호, DH 헤드 번호, DL 드라이브 번호

 

 

 

플로피 디스크 구조

- 실린더(원통) : 큰 원(0~79번까지 80개 존재)

- 헤드 (자기헤드): 집게같이 생긴거 - 읽기용 헤드(위의꺼 0번), 쓰기용 헤드(아래꺼 1번)로 2가지

- 섹터 :  실린더와 헤드를 지정하면 데이터를 쓰거나 읽을수 있으나 너무 많아 나눔.

            피자조각을 나눈 조각 같은거 1 ~ 18번까지 18개 존재. 하나의 섹터당 512바이트 저장 가능

- 플로피 디스크의 크기 = 80 x 2 x 18 x 512(바이트) = 1,440KB = 1.4MB 플로피 디스크다

 

- 아래의 그림은 1.4 mb 짜리 플로피 디스켓

https://www.alamy.com/stock-photo-floppy-disk-14mb-15840692.html

 

 

 

우리의 경우 인터럽트시 무엇을 읽을까?

- MOV CH, 0 => 실린더 번호 0번에서의

- MOV DH, 0 => 헤드 번호 0번의

- MOV CL, 2 => 2번 섹터에서

- MOV DL, 0x00 => 0번 드라이브(플로피 디스켓이 입력되는 A디스크)

=> IPL은 C0-H0-S1에 존재. 다음에는 C0-H0-S2를 읽음

 

 

 

300x250
728x90

카이스트, 서강대에서

vr, ar 인력을 양성하기 위해

크게 국비 지원을 받고 있다고 한다.

 

 

 

 

나도 이 과정에 관심은 있긴한데

지원해보기에는 걱정부터 앞서긴 한다.

언젠가 기회가 된다면 도전해보곤 싶지만 두려움이 크다.

 

서울대는 가상/증강현실 하드웨어

서강대는 콘텐츠

카이스트는 SW 위주로 연구되는듯 하다.

 

 

커리큘럼

 

 

 

 

 

 

www.slideshare.net/slideshow/embed_code/key/3vn7GwfK4qsnlS"

300x250

'미분류' 카테고리의 다른 글

2020.07 학습 후기 및 8월 계획  (0) 2020.08.02
2020-08-02  (0) 2020.08.02
2020-07-31  (0) 2020.07.31
2020-07-30  (0) 2020.07.31
2020-07-29  (0) 2020.07.30
728x90

Makefile

- 빌드 규칙을 정리한 파일

- make 명령을 주면 정해진 규칙대로 수행하여 출력 파일 생성

 

 

helloos5 구조

- 기존의 nas 파일, 부트섹터만 만든 bin파일, make.bat, 빌드를 위한 Makefile로 구성

 

Makefile 전체

 

default :
	../z_tools/make.exe img


ipl.bin : ipl.nas Makefile
	../z_tools/nask.exe ipl.nas ipl.bin ipl.lst

helloos.img : ipl.bin Makefile
	../z_tools/edimg.exe   imgin:../z_tools/fdimg0at.tek \
		wbinimg src:ipl.bin len:512 from:0 to:0   imgout:helloos.img

# 커멘드

asm :
	../z_tools/make.exe -r ipl.bin

img :
	../z_tools/make.exe -r helloos.img

run :
	../z_tools/make.exe img
	copy helloos.img ..\z_tools\qemu\fdimage0.bin
	../z_tools/make.exe -C ../z_tools/qemu

install :
	../z_tools/make.exe img
	../z_tools/imgtol.com w a: helloos.img

clean :
	-del ipl.bin
	-del ipl.lst

src_only :
	../z_tools/make.exe clean
	-del helloos.img

 

Makefile 빌드 규칙 예제

- make -r ipl.bin

  => 명령을 입력하면 Makefile이 아래의 규칙을 수행하여 ipl.bin과 ipl.lst 출력

- ipl.bin : ipl.nas Makefile

  => ipl.bin을 빌드하기 위해 ipl.nas와 Makefile이 필요 (의존 관계 설명)

- 나머지 내용들도 이와 같이 빌드 수행

 

 

Make 명령 실행 결과

- 위 작성 규칙대로 ipl.bin과 ipl.lst가 생성됨

 

이미지도 만들자

- make -r helloos.img

 => 규칙대로 helloos.img 파일이 출력됨

 

Makefile 명령 정의하기

- 빌드 규칙으로 쉽게 빌드했으나 다 입력하기 힘듬

=> 명령(커멘드) 정의를 통해 자동화 하자

 

커맨트로 이미지 쉽게 만들기

- helloos.img를 지우고, make img 입력

=> make img 명령 규칙에 따라 helloos.img 생성

 

 

나머지 규칙

- make run : img 생성 후 실행

 * run 하기전에 bash 셀인 경우 copy 가아니라 cp로 변경해야함! 별도 경로 에러도 고치자

- make install : img 생성후 플로피디스켓에 저장

- make clean : img 만드는데 사용한 bin파일과 lst 파일 삭제

 

 

make run 결과

- qemu 상에서 잘 부팅되고 있음

300x250
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

 

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가 출력되도록 수정

  * 리스트 파일 : 어떤 명령이 어느 기계어로 번역되었는지 확인 가능 

수정된 asm.bat 좌측. 기존의 파일 우측
ipl.lst

 

- 나머지는 디스크 이미지 툴로 만들기

 1. makeimg.bat 작성

 2. maikeimg.bat은 ipl.bin을 부트섹터로 하여 디스크 이미지  helloos.img 생성

 

 

 

 

 

 

300x250
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