"64비트 멀티코어 OS 원리와 구조"를 공부하고 있는 초보입니다.

 

책보면서 공부하다가 질문이 있어서 이렇게 올립니다.

 

다름이 아니라

 

1권 P127 를 보면

 

아래와 같은 해당  C 코드를 gcc 로 컴파일후 objdump로 어셈블이어 코드를 추출하는 부분이 나옵니다.

 

int i=0;
 char *pcVideoMemory=(char *)0xB8000;

 while(1)
 {
  pcVideoMemory[i]=0;
  pcVideoMemory[i+1]=0x0A;

  i+=2;

  if(i>80*25*2)
  {
   break;
  }

 }

 

그런데 위 C코드를 보면  main() 함수가 없습니다.

이런 코드도 컴파일이 가능한 겁니까?

 

저같은 경우는 컴파일 해 보니

 

$ gcc -c CleanTest.c -o CleanTest.o -O2
CleanTest.c:7: error: expected identifier or ‘(’ before ‘while’

 

위와 같은 에러가 발생하였씁니다.

다른 분들은 이와 같은 문제가 없는지 궁금하기만 합니다.

 

그래서 혹시나 하는 맘에

 


int main(int argc,char *argv)
{
 int i=0;
 char *pcVideoMemory=(char *)0xB8000;

 while(1)
 {
  pcVideoMemory[i]=0;
  pcVideoMemory[i+1]=0x0A;

  i+=2;

  if(i>80*25*2)
  {
   break;
  }

 }
}

위 코드와 같이 main() 함수로 감싼후 gcc로 컴파일 해 보니 별문제 없이 컴파일이 되었습니다.

그런 후 objdump로 assmbly  코드를 추출해 보니

아래와 같은 결과가 나왔습니다.

 

$ objdump -d CleanTest.o

CleanTest.o:     file format pe-i386


Disassembly of section .text:

00000000 <_main>:
   0:   8d 4c 24 04             lea    0x4(%esp),%ecx
   4:   83 e4 f0                and    $0xfffffff0,%esp
   7:   ff 71 fc                pushl  -0x4(%ecx)
   a:   55                      push   %ebp
   b:   89 e5                   mov    %esp,%ebp
   d:   51                      push   %ecx
   e:   83 ec 04                sub    $0x4,%esp
  11:   e8 00 00 00 00          call   16 <_main+0x16>
  16:   31 c0                   xor    %eax,%eax
  18:   c6 80 00 80 0b 00 00    movb   $0x0,0xb8000(%eax)
  1f:   c6 80 01 80 0b 00 0a    movb   $0xa,0xb8001(%eax)
  26:   83 c0 02                add    $0x2,%eax
  29:   3d a2 0f 00 00          cmp    $0xfa2,%eax
  2e:   75 e8                   jne    18 <_main+0x18>
  30:   83 c4 04                add    $0x4,%esp
  33:   59                      pop    %ecx
  34:   5d                      pop    %ebp
  35:   8d 61 fc                lea    -0x4(%ecx),%esp
  38:   c3                      ret
  39:   90                      nop
  3a:   90                      nop
  3b:   90                      nop
  3c:   90                      nop
  3d:   90                      nop
  3e:   90                      nop
  3f:   90                      nop

Administrator@dongman-PC /usr/test
$

 

책에서는

 

mov si,0

 

.SCREENCLEARLOOP:

      mov byte [es:si],0

      mov byte[es:si+1],0x0A

     add si+2

    cmp si,80*25*2

    jl : SCREENCLEARLOOP

 

와 같이 되어 있는 책 내용이랑 너무 다른거 같습니다.

 

 보다가 어떻게 이해해야 할지 몰라서 이렇게 글을 올립니다.

 

c언어로 되어있는 책의 소스를 어떻게 컴파일 하는게 옳은지

 

원래 이게 맞는 건지 알고 싶습니다.

 

초보라 모르는 부분이 많으니 친절한 답변 부탁드립니다.

 

그럼 여러모도 바쁘실텐데

 

많이 부족한 이 글을 읽어 주셔서 감사합니다.

 

그럼 답변 기다리겠습니다.