이번에 사용할 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

 

 

 

 

 

 

+ Recent posts