운영체제 없이 화면에 A를 찍어보아요...

말하기 앞서서
일단 세그먼트/오프셋이 뭔지 알고 있다고 가정하고  내용을 작성하였습니다.
그것만 알고 계시다면 다음 이야기를 읽는데는 지장이 없을듯하네요
뭐 틀린내용이 있을수도 있으니 100%다 믿진 마시고요;
혹시 틀린게 있으면 지적 부탁합니다
덧> vmware,nasm,vi 정도는 다 아신다고 가정

0 preview
[org 0x07C0]:처음 시작 주소를 여기부터 시작한대여..바이오스가 이주소를 제일 먼저 읽는다고 함
(왜 거기냐? 라고 묻지마세요 저도 모릅니다 찾아도 도저히 못찾겠더라고요..혹시 아시는 분 있으면 댓글 부탁;)
mov        :데이터 치환 (nasm에선 mov ax,0x07 하면 ax=0x07과 같다고 보면 된다)
byte[es:di]:es레지스터에서 di의 오프셋의 위치의 데이터에서 byte(1byte)만큼 데이터를 읽는다
C랑 비교한다면
char buf[3];            이 있다고 할때
char는 byte,buf 는 es, []안의 숫자는 di로 보면 되겠다...(이게 더 복잡한가?)

=>plus! 그리고 byte[di] 같이 쓰는것은 ds레지스터를 생략해서 쓴것뿐이다
(ds세그먼트의 di 오프셋)
byte[ds:di] == byte[di]랑 같다는 얘기!!

1우리가 알아야 하는것
1)0x7C0라는 주소(세그먼트) 에 프로그램을 위치시켜야한다(org []라는게 이말이다)
2)비디오 메모리(화면에 출력하기 위한) 의 세그먼트는 0xB800이다
3)비디오 메모리 세그먼트가 가리키는 위치에 (오프셋대로)순서대로 값을 집어 넣는다
==>offset 에 관해서.. 첫번짜 byte는 문자 두번째 바이트는 색깔을 잡어 넣는다
ex> 0x07이라면.... 0검정 7하양(0x 0 7)

  1 [org 0x07C0]
  2
  3 mov byte[0xB800:0x0000],'A'  
  4 mov byte[0xB800:0x0001],0x07

이상하네... 바로 메모리 접근이 안되나보다.세그먼트 레지스터를 이용해서 접근해보자
es세그먼트(사용자세그먼트 레지스터)레지스터에다가 0xB800를 (컬러 비디오 메모리 주소)
복사한다음 그 값을 복사한 범용레지스터를 다시 세그먼트 레지스터에 복사해 넣는다
대충 다름과 같은 예가 되겠지...
ax=0x07
es=ax
암튼....그리하여 ax,로 넘긴다음  ... es를 설정해준다

  1 [org 0x07C0]
  2
  3 mov ax,0xB800
  4 mov es,ax
  5    
  6 mov byte[es:0],'A'
  7 mov byte[es:1],0x07

이리하면 잘아알 실행됨.. 화면에 당당히 A출력,바탕은 검정,글색깔은 흰색
ds 레지스터를 이용하여 좀더 간단하게

  1 [org 0x07C0]
  2
  3 mov ax,0xB800
  4 mov ds,ax
  5    
  6 mov byte[0],'A'     ;[ds:0]
  7 mov byte[1],0x07;[ds:1]
 
일단 좀더 폼 잡어서 약간더 추가하면..
  1 [org 0x07C0]
  2
  3 start:
  4     mov ax,0xB800
  5     mov es,ax
  6     mov di,0
  7
  8     mov byte[es:di],'A' 
  9     inc di ;c로 치면 di++
 10     mov byte[es:di],0x07
 11
 12     jmp $

추가:jmp $란 현재주소에서 현재주소로(?) jump!하기다 즉,제자리 뛰기
현재상태를 유지하기 위해서다 (프로그램이 끝나면 안되므로..그래도 때에 따라서 돌아가는덴 지장 없을때도)

아놔 이거 하나 안다고 정말 뻘짓한 시간 생각하면 크윽..;;
어셈블리 생판 모르는 상태애서 이거 이해한다고 어려워 죽는줄(?) 알았어영 ㅜㅜ
저같이 삽질을 하시는 분을 조금이라도 줄이기 위해서 이글을 바칩니다 ㅜㅜ 어흑...

'Programming > Kernel' 카테고리의 다른 글

확실히 다르잖아!!  (4) 2008.04.15
ctags 설정  (4) 2008.03.11
본체 전원키로 시스템 off 시키기  (4) 2007.04.22
KernelProgramming-printk  (5) 2006.07.24
Kernel Panic!  (2) 2006.07.21