이번에 사용할 helloos3 이미지 어셈블리파일
;hello-os
;TAB
ORG 0x7c00 ;메모리내 어디에 로딩되는지
JMP entry
DB 0x90
DB "HELLOIPL" ; boot sector이름을 자유롭게 써도 좋다(8바이트)
DW 512 ; 1섹터 크기(512로 해야 함)
DB 1 ; 클러스터 크기(1섹터로 해야 함)
DW 1 ; FAT가 어디에서 시작될까(보통 1섹터째부터)
DB 2 ; FAT 개수(2로 해야 함)
DW 224 ; 루트 디렉토리 영역의 크기(보통 224엔트리로 해야 한다)
DW 2880 ; 드라이브 크기(2880섹터로 해야 함)
DB 0xf0 ; 미디어 타입(0xf0로 해야 함)
DW 9 ; FAT영역 길이(9섹터로 해야 함)
DW 18 ; 1트럭에 몇 개의 섹터가 있을까(18로 해야 함)
DW 2 ; 헤드 수(2로 해야 함)
DD 0 ; 파티션을 사용하지 않기 때문에 여기는 반드시 0
DD 2880 ; 드라이브 크기를 한번 더 write
DB 0,0,0x29 ; 잘 모르지만 이 값으로 해 두면 좋은 것 같다
DD 0xffffffff ; 아마, 볼륨 시리얼 번호
DB "HELLO-OS " ; 디스크 이름(11바이트)
DB "FAT12 " ; 포맷 이름(8바이트)
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 "hello, world"
DB 0x0a ;줄바꿈문자2개
DB 0
RESB 0x7dfe-$ ;0x7dfe까지 0x00으로 채우기
DB 0x55, 0xaa
; boot sector 이외부분 기술
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 4600
DB 0xf0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00
RESB 1469432
실행결과

어셈블리 정리
ORG : 여기부터 프로그램 시작점, 여기 기준으로 로드됨
JMP : goto
entry : 레이블 선언
MOV AX,0 : AX에 0 대입
16비트 레지스터들
AX(누산기), CX(카운터), DX(데이터), BX(베이스), SP(스텍포인터), BP(베이스 포인터), SI(소스인덱스), DI(목적인덱스)
세그먼트 레지스터들
ES 엑스트라 세그먼트, CS 코드 세그먼트, SS 스택세그먼트, DS 데이터세그먼트
ORG와 레이블 이해
ORG로 0x7c00에서 시작
entry는 0x7c50
msg는 0x7c74
MOV SI, msg => SI 소스인덱스 레지스터에 0x7c74 대입
[]이해하기
MOV WORD [678], 123 : 678, 679번지에 123 입력(리틀엔디언식)
데이터크기 [번지]
ex : BYTE [SI], WORD[BX], SI에 987이 있을떄 : BYTE[987] == BYTE[SI]
MOV AL, [SI] 이해하기
MOV AL, BYTE[SI]에서 데이터크기 BYTE 생략(AL은 8비트 레지스터이므로 크기 생략가능)
MOV AL, [SI] : SI번지의 1바이트를 AL로 대입하라
ADD 연산
ADD SI, 1 : SI = SI + 1
CMP 비교 연산
CMP AL, 0
JE fin
AL == 0 이면 fin으로 가라
INT
- 인터럽트
- INT 주소 : 주소 함수 호출
- INT 0x10 : 16번 비디오제어 함수 호출
BIOS 문자 표시 적기
- AH = 0x0e;
- AL = 캐릭터 코드
- BH = 컬러코드
- 리턴 : 없음
putloop 파트와 같이 보기
- AL 누산기LOW에 SI 소스인덱스 레지스터 번지 값 대입
- SI = SI +1
- 누산기 LOW가 0이면 fin으로
- MOV AH, 0x0e로 문자 표 시설정
- MOV BX,15로 컬러 설정
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
helloos2에서 DB로 작성한 어셈블리 코드가
좌측과 같이 고쳐졌는데
putloop 부분이 잘 이해되지 않는다.
SI 소스 인덱스 레지스터에다가 msg 레이블 넣고
SI주소값을 AL에다 대입
SI 다음 주소값을 AL에다 대입
계속반복
msg 마지막엔 db 0가 있으므로
putloop CMP AL,0이 true가 되는 때가 온다.
아 JMP msg가 아니라
MOV SI, msg라
entry: 레이블 다음에 그대로 putloop에 진행한듯보인다.
helloos3 | helloos2 |
![]() |
![]() |
'컴퓨터과학 > os' 카테고리의 다른 글
OS30 - 5. ipl 만들기, c언어 진입 (0) | 2024.04.05 |
---|---|
OS30 - 4. 부트섹터 분할시키고 make 사용하기 (0) | 2024.04.05 |
OS30 - 2. 어셈블리 시작 (0) | 2024.04.04 |
OS30 - 1. 시작 : 바이너리 에디터로 부팅 이미지 만들기 (0) | 2024.04.04 |
navilos - 19. 동기화 (0) | 2022.08.25 |