gcc
은 하드웨어에서 지원되지 않는 정수 유형의 곱셈 또는 나눗셈을 볼 때 특수 라이브러리 함수를 호출합니다.x86에서 gcc가 long으로 long으로 사용하는 divdi3 division
http://gcc.gnu.org/onlinedocs/gccint/Integer-library-routines.html#Integer-library-routines
따르면 링크 위 long __divdi3 (long a, long b)
긴 계열 사용. 그러나, 여기 http://gcc.gnu.org/onlinedocs/gcc-3.3/gccint/Library-Calls.html divdi는 "하나의 서명 된 더블 워드의 분할 요청"이라고 설명했습니다. 첫번째 소스가 디 접미사의 클리 어리 매핑이있는 경우 -> 긴 인수, 둘째 주 (오른쪽, 단일?) 풀 단어를 udivdi을 두 번 단어를 divdi 및
내가 함께 간단한 예
int main(int argc, char *argv[]) {
long long t1, t2, tr;
t1 = 1;
t2 = 1;
tr = t1/t2;
return tr;
}
를 컴파일 할 때 gcc -Wall -O0 -m32 -march=i386
(GCC 버전. 4.7.2) dissamble 날
080483cc <main>:
80483cc: 55 push %ebp
80483cd: 89 e5 mov %esp,%ebp
80483cf: 83 e4 f0 and $0xfffffff0,%esp
80483d2: 83 ec 30 sub $0x30,%esp
80483d5: c7 44 24 28 01 00 00 movl $0x1,0x28(%esp)
80483dc: 00
80483dd: c7 44 24 2c 00 00 00 movl $0x0,0x2c(%esp)
80483e4: 00
80483e5: c7 44 24 20 01 00 00 movl $0x1,0x20(%esp)
80483ec: 00
80483ed: c7 44 24 24 00 00 00 movl $0x0,0x24(%esp)
80483f4: 00
80483f5: 8b 44 24 20 mov 0x20(%esp),%eax
80483f9: 8b 54 24 24 mov 0x24(%esp),%edx
80483fd: 89 44 24 08 mov %eax,0x8(%esp)
8048401: 89 54 24 0c mov %edx,0xc(%esp)
8048405: 8b 44 24 28 mov 0x28(%esp),%eax
8048409: 8b 54 24 2c mov 0x2c(%esp),%edx
804840d: 89 04 24 mov %eax,(%esp)
8048410: 89 54 24 04 mov %edx,0x4(%esp)
8048414: e8 17 00 00 00 call 8048430 <__divdi3>
8048419: 89 44 24 18 mov %eax,0x18(%esp)
804841d: 89 54 24 1c mov %edx,0x1c(%esp)
8048421: 8b 44 24 18 mov 0x18(%esp),%eax
8048425: c9 leave
8048426: c3 ret
참고 8048414: call 8048430 <__divdi3>
를 나타낸다.
내 프로젝트에 gcc lib를 사용할 수없고 멀티 플랫폼입니다. 나는 모든 플랫폼에 대해 모든 __*
함수를 쓰지 않기를 바랬는데 (속도는 중요하지 않음), 이제는 다소 혼란 스럽다.
누군가가 설명 할 이유가 (__divti3
되지 않음) long long int
(64 비트) 부문에 대해 생성 호출 __divdi3
?
고마워요. 나는 그 게시물을 고쳤다. 질문은 algorythm이 아니라 관례입니다. 나는'__divti3' 호출을 볼 것으로 예상했지만 거기에는'__divdi3'가 있습니다. – user2718551
수정되었습니다. – user35443
고마워,하지만'd'가''long' **이나 **'long long'을위한 이유는 아직 불분명하다. 게시자가 제공하는 소스가 게시물의 첫 번째 링크입니다. 'd'는'long ','t'는'long long'을위한 옵션이없는 상태입니다. 몇 가지 변형이있을 수 있는데 왜'd'가 선택되고't'가 아닌가? – user2718551