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