Life is ..2010. 1. 24. 22:14
울 애기들 생일 축하 선물

막 한글 뗀  첫째 선물


사용자 삽입 이미지

한글을 모르고 그림을 그리는 둘째
 
사용자 삽입 이미지

'Life is ..' 카테고리의 다른 글

대천 바닷가  (0) 2010.03.14
사무실 꾸미기  (0) 2010.03.06
심심한 기자님들..  (0) 2010.01.19
인터넷으로 꿈을 이뤄가는 사람들  (0) 2009.12.22
SIGGRAPH [3]  (1) 2009.08.12
Posted by GUNDAM_IM
Books2010. 1. 22. 10:04
사용자 삽입 이미지

팀단위 프로젝의 능률을 올리는 책은 서점에서 넘치고 있지만, 개인단위의 능률에 대하여 언급한 책은 이 책이 거의 처음인것 같습니다.   시간날때 가벼운 마음으로 한번 읽어볼 수 있는 책입니다.

래리 월이 지은 PERL Programming이라는 책에서 프로그래머가 갖추어야 할 3대 덕목으로
" 게으름 , 조금합, 오만함 " 이라고하였습니다.

게을러야 어떻게든 일의 양을 줄일려고 하고
조급해야 컴퓨터가 더 빨리 처리할 수 있는 일에 사람의 손을 넣으려고하지 않고
오만해야 아무도 손대려 들지 않는 문제를 처리하기 위해서 팔을 걷어 붙인다고 하였습니다.

요새 작업하는 것을 가만히 보면 책에 나온대로, 사람이 컴퓨터에게 일을 시키는지, 컴퓨터가 사람에게 일을 시키는지 헤깔리는 경우가 많습니다.  그래서 이런 엉뚱한 무한루프에서 헤메는 사람들에게 간단한 팁을 알려주는 것이 아니라, 여러가지 효율을 높일 수 있는 장치나,  방법에 대해서 설명하는 책이 바로 이 "능률적인 프로그래머, 생산성의 비밀" 이라는 책입니다.

책 내용은 전반부에서는 간단한 팁 프로그램위주로 설명을 하고 있습니다 여러가지 상황에서 상황별로  자동화에 관계된 프로그램을 개략적인 개념과 함께 소개해주고 있습니다.  개개가 간단한 프로그램이 아닐 수 있지만, 1주일에 한개씩 배우고, 배운것을 조합하여 사용하면 능률이 좋아진다 라는 이야기를 하고 있습니다.

후반부에서는 코드작성에 대한 이야기를 생산성 관점에서 하고 있습니다.

 이 책의 모토를 한마디로 정한다면
 "DRY Don't Repeat Yourself!!!"
 입니다. 즉 하나의 작업을 반복하지 말고, 반복되는 모든것을 자동화 하거나 툴을 동원하여 해결하라는 의미입니다. 

작가 닐포드는
  http://www.nealford.com/
에 홈피를 만들어 놓고, 이 책에 대한 내용뿐만 아니라, 다른 여러가지 다른 정보를 올리고 있습니다.
여러 세미나를 다니며 발표하고 있는데 이 세미나 발표 자료를 함께 올리니 한번 보아두는 것도 도움이 됩니다.

 번역하신분도 블로그를 만들어 놓으시고 의견 교환을 하실려고 하셨지만, 그렇게 활발하게 이루어지지 않고 있습니다. 작가 사이트가 더 도움이 될것 같더군요

이 책의 아쉬운점은, 뒷부분에 가면 굳이 저랑 상관없는 진짜 프로그래밍 관련 내용이 들어가 있어서 저한테는 잘
안맞는 부분이 아쉬움이라면 아쉬운 부분입니다.  반대로 생각한다면, 이 책은 다양한 언어를 계속해서 설명하고 있기 때문에 그만큼 이 책의 저자는 다양한 언어에 대해서 통달한것 같습니다.

바쁜시간 쪼개서 읽을만한 가치가 있다기 보다는 머리 식힐때 쉽게 쉽게 한번씩 읽어볼 수 있는 책입니다.
아침에 출근할때 차 엔진 시동걸어 놓고 예열할때 조금씩 조금씩 읽기에 딱 좋은 책입니다.

'Books' 카테고리의 다른 글

나, 건축가 안도 다다오  (0) 2010.05.05
손에 잡히는 정규 표현식  (2) 2010.03.27
전략의 탄생  (0) 2009.11.25
SystemC로 하는 JPEG 코덱 설계  (0) 2009.10.30
재미있는 책 2 권 소개합니다.  (0) 2009.09.21
Posted by GUNDAM_IM
Life is ..2010. 1. 19. 08:50

심심한 기자님들...


웹툰 작가 윤서인 소녀시대 '성희롱?' 소시팬들 '발끈'


윤서인이라는 웹툰 작가님이 인터넷에 소녀시대 관련하여 글을 올린것이 꽤 예전입니다만,

이제와서 이슈가 되는것을 보면 참 기자님들이 기사거리가 없어서 고생하시는구나 하는 생각이 듭니다.


웹툰이 반드시 그런 의도로  그린것이 아닌것 같은데,  

그걸 확대 해석하고 글을 올려서 결국, 작가의 사과문에 SM에서 법적 검토한다는 둥,

기삿감 찾기 + 뒷북치기의 극상 무공을 보여주고 있어서 웬지 씁쓸~~합니다.


개인적으로는 윤서인 작가님이 가끔 오버하는 글을 (그리고 간혹 확실히 오버한 그림을.. ) 올린다고 생각하지만,

그렇다고, 이렇게 까지 뒷북치고 게다가

작가가 올린 사과문내용에 소녀시대에 대한 별도의 사과 글이 없다는 글이나 기사도 올라오는 것을 보면 참 대단하다 라는 생각마저 듭니다.


기자님들이 그만큼 심심하다는 의미인것 같습니다.


윤서인님께서 참고 힘내시길 바랍니다.



'Life is ..' 카테고리의 다른 글

사무실 꾸미기  (0) 2010.03.06
애기들의 생일 축하 선물  (0) 2010.01.24
인터넷으로 꿈을 이뤄가는 사람들  (0) 2009.12.22
SIGGRAPH [3]  (1) 2009.08.12
SIGGRAPH.....  (0) 2009.07.31
Posted by GUNDAM_IM
ASIC SoC2010. 1. 18. 17:04
SystemC로 설계하는 도중에 정리를 하지 못한것이 있었습니다.
- 이 문제로 반나절을 버그 찾느라고 날렸습니다.
- 알고나면 아주 간단한건데 역시 모르면 닭질하는군요

이 내용는 KAP의  SystemC: from the ground up에서 가지고 왔습니다.
Chapter 10절에 해당하는 내용입니다.

계층적으로 설계할 경우 서브 모듈에서 다른 서브 모듈을 불러서 할 경우 2가지 방법이 있습니다.
하나는 Direct sub module header only implementation 방식이고
다른 하나는 Indirect sub module header only implementation 방식입니다.

아래와 같은 방식이 전자인 직접 연결 방식입니다.

SC_MODULE(body)
{
.......
   Wheel wheel_R ;
   Wheel wheel_L ;
........

  CTOR(body)
    : wheel_R("WHEEL_R"),
      wheel_L("WHEEL_L")
    {
      ......

      ......
    }


};

아래 방식이 간접 연결 방식입니다.

SC_MODULE(body)
{
.......
   Wheel pWheel_R ;
   Wheel pWheel_L ;
........

  CTOR(body)
    {
      ......
     pWheel_R = new Wheel("Wheel_R");
     pWheel_L = new Wheel("Wheel_L");
      ......
    }
 ...
};


차이점은 직접 인스턴스를 만드느냐 아니면 포인터로 받느냐 입니다.
에궁 이 단순한것도 몰라서 고생하다니 웬지 억울합니다.
매뉴얼 안보고 게임하는거나 같군요

'ASIC SoC' 카테고리의 다른 글

HD Quad Display/Processing Engine  (1) 2010.03.12
Sound Effect Processor  (0) 2010.02.01
[MIPS] OSX에서 MIPS C Compiler를 빌드하기  (0) 2009.12.17
PERL TIP  (0) 2009.12.05
Timing Chart  (0) 2009.11.08
Posted by GUNDAM_IM
Embedded2010. 1. 13. 11:11
XCode에서는 코드 버전관리 기능이 들어가 있습니다.
저는 MACPRO에 SVNServer를 설치하고, MAC PRO나 MAC BOOK PRO에서 작업을 하면서, 코드를 일치시키고 있습니다.
그런데 빌드 폴더가 Commit가 안되는 경우가 발생합니다. 이 경우 아래와 같이 수정하였습니다.

이 오류는 빌드 폴더가 재 컴파일 시에 수시로 지워지거나 하기 때문에 발생합니다.

쉬운 방법은 SVN Configuration파일을 수정합니다.

~/.subversion/config
파일에서 주석문 처리된 것을 풀어냅니다.

[miscellany]
### Set global-ignores to a set of whitespace-delimited globs
### which Subversion will ignore in its 'status' output, and
### while importing or adding files and directories.
global-ignores = build *.model *.pbxuser *~.nib .DS_Store *~ 

위의 붉은색 라인에 주석문을 지웁니다.
그리고 아래 라인을 추가합니다.

 global-ignores = build *.mode1 *.pbxuser *~.nib .DS_Store *~


이후에 프로젝트를 다시 re-import하고
하드에 있는 프로젝트를 지우고
다시 check-out 하면 됩니다.

re-import시에 겹치므로, 서버에 있는 것을 지워져 있어야 합니다.


Posted by GUNDAM_IM
Hobby2010. 1. 12. 06:30
일본 하코네 여행을 대비한 지도
다음에서 얻어온 그림입니다.

사용자 삽입 이미지
에반게리온 보완맵이 있는데 아직 어데서, 다운받을 수 있는지 못찾았습니다.
배포받는것은 포기했고요~~

'Hobby' 카테고리의 다른 글

AileStrike GUNDAM 실사판 합성  (2) 2010.03.17
GANTZ 레이카 피규어  (2) 2010.02.09
새로운 트랙키의 시작입니다.  (0) 2010.01.05
아~~~ 아~~~ 얄미운 아이폰  (0) 2009.12.09
[DQ9] 오오 드디어 엔딩으로  (0) 2009.11.17
Posted by GUNDAM_IM
Hobby2010. 1. 5. 00:02
사용자 삽입 이미지


GUNDAM은 스타워즈 보다는 스타트랙을 좋아합니다.
보이져를 본 뒤에 완전히 팬이 되어서 스타트랙 극장판을 다 모았습니다.
안타깝게도 국내에서는 극장판이 극장에 걸리지 못합니다. 하기사 스타워즈도 팍팍하게 걸리고, 내리기가 급급한데 하물며 스타트랙은 당연지사겠지요...

  스타트랙 넥서스 제너레이션을 보면 제임스 커크 함장이  나와서 전사하고 USS 엔터프라이즈호가 땅에 처박히면서 끝납니다. 그리곤 마지막에 피카드 함장이 "더이상의 엔터프라이즈호는 없다" 는 상당히 무책임한 말로, 끝내버려서 수많은 팬들의 원성을 샀습니다. 말그대로, 어줍잖은 놈이 나와서 명작의 맥을 끊어버렸기 때문입니다.

사용자 삽입 이미지
           이분이 바로 피카드 함장님입니다. 이분 잘못이겠냐만은 하여튼 스타트랙 씨리즈를 어줍잖게말아 먹은 뒤로, X-MAN 씨리즈로 재기하신 분이죠

사용자 삽입 이미지
  명작씨리즈를 말아먹은 스타트랙  넥서스 제네레이션입니다.

  이넘의 넥서스 제너레이션이  TV판도, 그저 그렇더니, 극장판까지 말아먹고 끝내 버렸기 때문에 이후 더이상 새로운 씨리즈가 없을 줄 알았는데 금번에 나온것이 STARTREK THE BEGINNING입니다.  
 
   사실 저도 이것을 직접 보기 전까지는 이 위대한 씨리즈를 말아먹은 뒤에 이도 저도 안되니 그냥 처음으로 가자 라는 느낌일 줄 알았습니다. 그 이유는 이 감독이 JJ 에이브람스라는데 있습니다.  JJ 에이브람스 감독은 초기 이야기에 관한한 타고난 이야기 꾼입니다.  소위 말하는 떡밥의 제왕입니다. 이야기 초기 / 중기에 엄청 큰것을 뿌려 놓고, 이야기 말기에 가면,  맥없이 끝나는 스토리를 쭈욱 나열하는 그런 류의 감독입니다. 그래서 항상 프리퀠감독, 혹은 오프닝 감독이라는 오명을 가지고 있습니다. TV판 엘리어스가 그런류의 대표작이라고 볼 수 있습니다.  영화 자체를 만드는 것은 조금 부족하지만, 때떄로 이야기를 잘 풀어가는 것이 등장 하기도 합니다. 글로는 아마게돈이 대표작이고, 영화로는 그의  대표작이 미션 임파서블 3 입니다.
아, 그리고 개인적으로는 별루지만 TV씨리즈물인 로스트가 있네요

  아직 약간은 불안감을 떨치지 못한 이 감독이 스타트랙을 만든다고 했을때 많은 사람들이 불안해 했지만, 이 스타트렉 더 비기닝을 통해서 그 불안을 완전히 해제시키는데 성공했습니다.  밀도감 있는 스토리를 처음부터 끝까지 배열시키고, 올드팬의 각성을 촉구할 장치를 군데군데 배치하는 등, 많은 신경을 썼더군요.   물론 올드팬이 아니어도 충분히 즐길 만한 스토리를 엮어냈습니다.


  꼭 봐야 하는 포인트는 교과서적인 특수 효과의 나열이라고 부를 수 있는 특수효과 장면들과 올드 캐릭터와 싱크로율 100%에 가까운 캐릭터의 등장입니다.

   등장부터 시작해서 이야기 중간 중간에 나오는 엄청난 액션 씬은, SF의 교과서 적인 연출로, 우주에서 벌어지는 특수효과씬을 정말 잘 만들었습니다. 별이 무너지는 장면에서 약간 엉성한 부분과, 대형 괴수가 횟불 하나로 쫓겨가는 몇가지 난해한 씬을 제외하면, 교과서적으로 만들었다는 것을 새삼 확인할 수 있었습니다.

  그리고 또한가지, 올드 멤버들의 아들/딸들을 구해서 배역을 시켰을 법 한, 정말 꼭 닮은 배역을 어데서 구했는지 신기할 정도로 닮은 배역을 배치해서 올드 팬들을 잘 끌어들였습니다.  
 
사용자 삽입 이미지
    제임스 커크의 현생 모델과 과거 모델입니다.  카리스마로는 윌리엄 샤트너가 연기한 제임스커그 I형이 훨씬 뛰어납니다만,  II형도 나름 높은 싱크로율을 보입니다.  참고로 I형의 윌리엄 샤트너의 최근 사진은 보지 마시기 바랍니다. (TT_TT)

 
사용자 삽입 이미지
24세기 우주시대에도 8:2 가르마가 유행일 줄은 T_T;;
사용자 삽입 이미지

스타트랙의 올드 멤버들입니다. 예전얼굴들을 이렇게 보면 기억이 날랑 말랑하지만 더 비기닝을 보면 정말 배우선택에서 싱크로 율이 높다는 것을 알 수 있습니다.
 

 사실 비견되는 씨리즈인 스타워즈는 스타워즈 1~3부가 아무래도 4~6부에 비해서는 아무런 스토리나 감동이 약합니다.  특수효과로 떡칠하였지만, 스타워즈가 주는 그런 감동이 약해져 버린것이 사실입니다.  소위 말하는 후속작들의 비애의 대표적인 예입니다. 전작이 워낙잘했으니 후작이 아무리 잘해도 욕먹기 마련입니다.  예외적인 작품으로는 터미네이터 2와 에어리언 2 정도입니다. 이 두작품 모두 제임스카메룬이 했으니 정말 이 감독도 타고난 감독이죠.

하여튼 오프닝의 제왕께서,   이번에 잘 만들어서 성공했으니, (성공했는지에 대한 정보를 얻지 못해서리... 희망사항일 수 있습니다.)  계속 해서 씨리즈 물로 갔으면 합니다.  

저는 맥아리 없는 넥서스 제너레이션의 피카드 함장 보다는 인류 역사 책에 이름을 올린 제임스 커크가 훨씬 좋습니다.  

  여담이지만, 케이블 방송에서 얼마전에 TV씨리즈에서 가장 섹쉬한 남성 주인공 리스트에서 올드 제임스커크 함장이 6위를 차지하였더군요.  마이클 나이트가 24위 인것을 보면 정말 엄청난 카리스마를 가진 인물임에는 틀림없습니다.

  추천 : 아이맥스에서 보면 좋지만, 이제는 상영하지 않으므로,
           DVD로 보실 수 밖에 없는데, 특유의 웅장한 느낌을 살릴려면 Woofer Speaker의 감도를 약간 상승 시켜 놓고 보시기 바랍니다. 쿠쿠쿠우우우웅... 하면서 나가는 느낌 정말 좋습니다.  


'Hobby' 카테고리의 다른 글

GANTZ 레이카 피규어  (2) 2010.02.09
[일본 여행] - 하코네 지도  (0) 2010.01.12
아~~~ 아~~~ 얄미운 아이폰  (0) 2009.12.09
[DQ9] 오오 드디어 엔딩으로  (0) 2009.11.17
Perl Debug command 정리  (0) 2009.11.17
Posted by GUNDAM_IM
Embedded2010. 1. 3. 07:59
이번에는  Loop문이 어떻게 바뀌는지에 대해서 살펴 봅니다.
예제를 새로 짜는 것 보다는 기존에 있던것을 가지고 한번 해보겠습니다.

아래는 NEWLIB 라이브러리에 있는 memset 함수입니다.
참고로, newlib은 c에서 사용하는 여러가지 라이브러리를 embedded  등에서 사용할 수 있도록 제공해주는 라이브러리입니다. 다양한 프로세서에 포팅되어 있습니다. 대부분의 함수가 C로 코딩되어 있지만, 속도가 필요한 부분이나 프로세서에 종속적인 부분에 대해서는 assembler로 되어 있습니다.

주어진 어드레스 m에서 시작해서 주어진 값 c를   n개의 메모리에 차례로 기록하는 것입니다.

........
#define PREFER_SIZE_OVER_SPEED 1
_PTR
_DEFUN (memset, (m, c, n),
        _PTR m _AND
        int c _AND
        size_t n)
{
#if defined(PREFER_SIZE_OVER_SPEED) || defined(__OPTIMIZE_SIZE__) || defined(__mips16)
  char *s = (char *) m;

  while (n-- != 0)
    {
      *s++ = (char) c;
    }

  return m;
#else
  char *s = (char *) m;
  int i;
  unsigned wordtype buffer;
......

#ifdef -else에서 #else는 복잡한(?) 판단문을 가지고 있으므로 위의 #ifdef를 이용하기로 합니다.
그래서 PERFER_SIZE_OF_SPEED를 Define하여서 #ifdef로 컴파일 되게 합니다.

코드를 보면 S라고 하는 스타팅 어드레스는 주어진 인자 m으로 세팅됩니다.
이후 while에서 n을 하나씩 밑으로 카운트 하면서 주어진 인자 c를  S포인터에 기록합니다.
이후 S 포인터를 하나씩 증가시킵니다.


컴파일 커맨드는 아래와 같습니다.
mips-elf-gcc -S -O2 memset.c -o memset.s

컴파일 결과는 아래와 같습니다.

        .file   1 "memset.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  memset
        .set    nomips16
        .ent    memset
        .type   memset, @function
memset:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        beq     $6,$0,$L7
        move    $2,$4

        sll     $5,$5,24
        sra     $5,$5,24
        move    $3,$4
$L3:
        addiu   $6,$6,-1
        sb      $5,0($3)
        bne     $6,$0,$L3
        addiu   $3,$3,1

$L7:
        j       $31
        nop

        .set    macro
        .set    reorder
        .end    memset
        .size   memset, .-memset
        .ident  "GCC: (GNU) 4.4.2"

위에서 보면 우선 $6이 $0과 같으면 $L7으로 분기하도록 되어 있습니다.
$0는 0 레지스터 값이므로 항상 0을 가집니다. 즉 주어진 카운트 값이 0이면 더이상 할 필요가 없으므로, 그냥 일을 마치고 돌아가는 것입니다.

따라서 $6이 인자 c (count)에 해당된다는 것을 알수 있습니다.

그리고 그 밑에

        sll     $5,$5,24
        sra     $5,$5,24

구분은 쉬프트 구문인데 $5를 왼쪽으로 24번 보냈다가 오른쪽으로 다시 24번 보내는 구문입니다.
뻉뻉이 돌리는 것인데요, 이렇게 하면 상위 24비트는 모두 0가 됩니다. 위의 구문은 그냥

and $5 , $5 , 0xFF와 같은 구문이 됩니다.

이렇게 해서 하위 8비트 즉 하위 1Byte만 사용한다는 것입니다. 인자 리스트를 쭈욱 보면 c에 해당하는 것이
함수 중간에서 char로 사용하고 있으므로 $5는 c에 해당하는 것임을 눈치밥으로 알수 있습니다.

      .......
      *s++ = (char) c; <-- 요기서  c가 char로 쓰이므로 불필요한 상위 24비트를 날려버리는 것이빈다.
      ....

이렇게 해서 필요한 / 사용할 데이터 타입과 변수들을 정리해 두고 whil에 해당하는 루프를 시작합니다.


$L3:
        addiu   $6,$6,-1
        sb      $5,0($3)
        bne     $6,$0,$L3
        addiu   $3,$3,1

을 살펴 봅니다.
$6이 카운트 값이라고 하였으니 addiu   $6,$6,-1  구문은 자연스럽게
 ...
 while (n-- != 0)
  ...
에서 n--에 해당함을 알 수 있습니다.
이제 갑자기 나온 레지스터 $3 이 보이는데 코드를 보면 레지스터 $5의 값을 어드레스 $3에 기록하는 것을 알 수 있습니다. 즉 메모리에 쓰는 어드레스를 $3에 기록합니다. 따라서 C코드에서 변수 s에 해당하는 것이 $3임을 알수 있습니다.

이후 카운트 값 레지스터 $6이 0이 아니면 계속 루프를 돌고 0이면 밑으로 내려가도록 되어 있습니다.
addiu $3,$3,1 은
어드레스를 1 증가시키는 것에 해당합니다.

      *s++ = (char) c;

에서 s++에 해당합니다.

이는 loop를 돌때 마다 해야 하므로 branch delay slot에 해당하는  BNE다음 구문으로 집어 넣습니다.

이렇게 해서 loop를 돌고 끝나면 jump로 복귀하게 됩니다.
복귀 문인 j 문 다음에 있는 NOP는 그냥 Delay Slot을 사용하지 않도록 하기 위해서 0으로 넣어버린 것입니다.






Posted by GUNDAM_IM
Embedded2009. 12. 30. 17:09
이번에는 조건부 분기문을 한번 보도록 하겠습니다.
C 코드는 아래와 같습니다.

typedef long TYPE;

TYPE foo( TYPE i , TYPE j )
{
  if ( i > j ) return i ;
  else  return j;
}


나중에 타입을 바꿀 경우를 생각해서 typedef로 선언했습니다.
비교해서 큰 값을 반환하는 것이 요지입니다.

        .file   1 "test.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  foo
        .set    nomips16
        .ent    foo
        .type   foo, @function
foo:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        slt     $2,$5,$4
        movz    $4,$5,$2
        j       $31
        move    $2,$4

        .set    macro
        .set    reorder
        .end    foo
        .size   foo, .-foo
        .ident  "GCC: (GNU) 4.4.2"


$4와 $5를 비교해서 그 결과를 $2에 저장합니다.
여기서 새롭게 등장하는 명령어가 movz입니다. 이 명령어는

if (GPR(rt) == 0 then rd <- rs

인 명령어입니다. 즉 주어진 값이 0 이면 이동 동작을 수행하라는 명령이죠.

위의 코드를 다시보면
slt 명령으로 set less then으로 세팅하고, 그 결과가 0 이면 $5를 $4로 아니면 그대로 진행합니다.
최종적으로 $4를 반환 레지스터인 $2로 이동함으로서 그 반환 값을 설정하도록 되어 있습니다.

ARM은 Instruction에 Condition Code를 넣어서 동작할 수 있도록 한 반면
MIPS는 Condition Code를 만들지 않고, 명령어를 운용하여서 분기문 내지 판단문을 처리할 수 있도록 하였는데, 위의 코드에서는 비교문을 SLT라는 명령어로 해결해서 다음 명령어에서 분기문의 효과를 내도록 되어 있습니다.

이럴때는 ARM Style이 더 낳을 것 같습니다.




Posted by GUNDAM_IM
Embedded2009. 12. 29. 14:58
앞서에 이어서  64비트 덧셈 코드를 테스트 해봅니다.

1. 64비트 덧셈

long long  foo( long long i ,  long long  j)
{
  return i + j ;
}

../local/bin/mips-elf-gcc -S test4.c -o test4.S -O2 -march=mips32

        .file   1 "test4.c"
        .section .mdebug.abi32
        .previous
        .gnu_attribute 4, 1
        .text
        .align  2
        .globl  foo
        .set    nomips16
        .ent    foo
        .type   foo, @function
foo:
        .frame  $sp,0,$31               # vars= 0, regs= 0/0, args= 0, gp= 0
        .mask   0x00000000,0
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro

        addu    $3,$7,$5
        addu    $4,$6,$4
        sltu    $2,$3,$7
        j       $31
        addu    $2,$2,$4

        .set    macro
        .set    reorder
        .end    foo
        .size   foo, .-foo
        .ident  "GCC: (GNU) 4.4.2"


64비트 덧셈은 뭐, 좀 쉽습니다.

             [$4 : $5]
   +       [$6 : $7]
-------------------
   

재미있는것은 캐리를 발생시키는 방식인데요 위의 어셈블러 코드를 보면
sltu가 있습니다. 이것은 두 수를 비교해서 앞에 수가 작으면 1을 세팅하다는 의미입니다.
캐리를 직접 계산하는 것으로 사용하는 명령어입니다.

비교하는 수를 보면 $5+$7을 더한 결과값 $3과 그 인자인 $7을 비교하는 것입니다.
즉 더해서 얻는 값이 인자보다 작다면 이는 자리수가 한자리 커졌다는 것을 의미합니다.

쉽게 정리하면
     5
+  7
-----
1  2

입니다. 이때 비교 하는 것은 7과 결과 2 입니다. 결과값 2가 7보다 작으므로 캐리가 발생한것으로 알 수 있다는 의미입니다.  (그냥 캐리를 발생시키는게 더 빠를것 같기도 합니다.)


'Embedded' 카테고리의 다른 글

[MIPS] Assembler 코드 살펴보기 - 4  (0) 2010.01.03
[MIPS] Assembler 코드 살펴보기 - 3  (0) 2009.12.30
[MIPS] Assembler 코드 살펴보기  (0) 2009.12.26
Fedora 메일서버 세팅  (2) 2009.12.21
[MIPS] Simulator  (0) 2009.12.20
Posted by GUNDAM_IM