728x90

현황

- 검은 화면이 뜨도록 만듬

- 뭔가 띄우려면 VRAM 비디오 램에 올바른 값을 써야함

 

문제

- c언어에서는 VRAM 등 직접 메모리 지정해서 쓰는 명령 없음 => 함수 작성

 * 사실 포인터를 이용해서 쓸수 있기하나 넘어가자

 

메모리에 쓰기 함수 추가하기

- naskfunc.nas에 write_mem8함수 추가(8비트 값을 쓰기)

- 사용법 : write_mem8(0x1234, 0x56)

 => 의미 : MOVE BYTE[0x1234], 0x56 -> 0x1234 번지에 바이트 크기(8비트)로 0x56이란 값을 쓴다.

- 사용 과정 : c언어에서 write_mem8() 함수 호출 -> naskfunc.nas의 _write_mem로 점프

- 아래의 코드에서 +4를 하는 이유 32비트 모드(4 x 8비트)이므로 한칸씩 이동하기 위함

 

 

INSTRSET

- 이 프로그램이 486용임을 nask에 알려줌.

 => nask는 EAX(32비트 레지스터)라는 단어를 만나면 레지스터로 해석함

 => 이걸 안해주면 8086 CPU 명령어로 생각해서 레이블 중 하나로 인식



 

 

 

인텔 CPU 아키텍처 흐름

- 8086 -> 80186 -> 286 -> 386 -> 486 -> Pentium -> PentiumPro -> Pentium2 -> Pentium3 -> Pentium4 ...

- 286까지 16비트 CPU, 386부터 32비트 CPU

 

 

 

bootpack.c  부트 프로그램 패키지 수정

- 변수 초기화 해주고

- VRAM에 값을 저어주는 명령을 써보자

 => 아래의 코드에선 0xa0000 ~ 0xaffff 번지에 15라는 값을 입력해줌

 

 

 

실행 결과

 

 

 

 

줄무늬 쓰기

- write_mem8(i, i & 0x0f);로 수정

- i와 0x0f를 and연산한 결과를 반환

- 정리

  0x0f = 0x0000 000f

     i     = 0x000a 0000

     i     = 0x000a  f f f f

=> i의 최하위 비트 LSB(Least Significant bit) 가 f인 경우 

    i번지에 0x0000 000f 쓰기

=> 이외의 경우

    i번지에 0x0000 0000 쓰기

- 결론 : 0x0000 0000 을 쓰다가   일정 구간이 지나서 0x0000 000f쓰기를 반복한다.

 

 

 

 

 

줄무늬 쓰기 실행결과

 

 

 

 

300x250

+ Recent posts