앞서에 이어서 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 |