어떤 함수 안에서 사용할수 있는 register변수의 수가 몇개나 되나요?
cpu는 intel p4이구요... 운영체제는 리눅스 입니다.
제가 알기론 사용 가능한 래지스터를 다 쓰면 그냥 mainmemory에 그 변수를 할당한다고 들었습니다...
테스트를 해봤는데,
main(){ register int a =1; register int b =2; register int c =3; register int d =4; register int e =5; register int f =6; register int g =7;
a = b+c+d+e+f+g; b = a+ c+d+e+f+g; c = a+b+ d+e+f+g; d = a+b+c+ e+f+g; e = a+b+c+d+ f+g; f = a+b+c+d+e+ g; g = a+b+c+d+e+f;
}
이런 어셈블리 코드를 만들어 내는군요 음 제가 7개의 레지스터 변수를 만들었는데, 스택으로 들어가는 것은 2개이고 나머지
804839b 83 ec 08 sub $0x8,%esp (스택 포인터가 8바이트 빼진것...)
80483a8 ba 02 00 00 00 mov $0x2,%edx 80483ad b9 03 00 00 00 mov $0x3,%ecx 80483b2 bb 04 00 00 00 mov $0x4,%ebx 80483b7 be 05 00 00 00 mov $0x5,%esi 80483bc bf 06 00 00 00 mov $0x6,%edi
5개는 요렇게 들어가네요.. 그런데 한가지 잼있는 사실은,,,
분명히 a부터 레지스터 변수로 지정을 했는데 컴파일러가 만들어낸 코드는 b~f까지가 레지스터 변수로 선언되었네요..
08048398 8048398 55 push %ebp 8048399 89 e5 mov %esp,%ebp 804839b 83 ec 08 sub $0x8,%esp 804839e 57 push %edi 804839f 56 push %esi 80483a0 53 push %ebx 80483a1 c7 45 f8 01 00 00 00 movl $0x1,0xfffffff8(%ebp) 80483a8 ba 02 00 00 00 mov $0x2,%edx 80483ad b9 03 00 00 00 mov $0x3,%ecx 80483b2 bb 04 00 00 00 mov $0x4,%ebx 80483b7 be 05 00 00 00 mov $0x5,%esi 80483bc bf 06 00 00 00 mov $0x6,%edi 80483c1 c7 45 fc 07 00 00 00 movl $0x7,0xfffffffc(%ebp) 80483c8 8d 04 11 lea (%ecx,%edx,1),%eax 80483cb 89 45 f8 mov %eax,0xfffffff8(%ebp) 80483ce 01 5d f8 add %ebx,0xfffffff8(%ebp) 80483d1 01 75 f8 add %esi,0xfffffff8(%ebp) 80483d4 01 7d f8 add %edi,0xfffffff8(%ebp) 80483d7 8b 45 fc mov 0xfffffffc(%ebp),%eax 80483da 01 45 f8 add %eax,0xfffffff8(%ebp) 80483dd 8b 55 f8 mov 0xfffffff8(%ebp),%edx 80483e0 01 ca add %ecx,%edx 80483e2 01 da add %ebx,%edx 80483e4 01 f2 add %esi,%edx 80483e6 01 fa add %edi,%edx 80483e8 03 55 fc add 0xfffffffc(%ebp),%edx 80483eb 8b 4d f8 mov 0xfffffff8(%ebp),%ecx 80483ee 01 d1 add %edx,%ecx 80483f0 01 d9 add %ebx,%ecx 80483f2 01 f1 add %esi,%ecx 80483f4 01 f9 add %edi,%ecx 80483f6 03 4d fc add 0xfffffffc(%ebp),%ecx 80483f9 8b 5d f8 mov 0xfffffff8(%ebp),%ebx 80483fc 01 d3 add %edx,%ebx 80483fe 01 cb add %ecx,%ebx 8048400 01 f3 add %esi,%ebx 8048402 01 fb add %edi,%ebx 8048404 03 5d fc add 0xfffffffc(%ebp),%ebx 8048407 8b 75 f8 mov 0xfffffff8(%ebp),%esi 804840a 01 d6 add %edx,%esi 804840c 01 ce add %ecx,%esi 804840e 01 de add %ebx,%esi 8048410 01 fe add %edi,%esi 8048412 03 75 fc add 0xfffffffc(%ebp),%esi 8048415 8b 7d f8 mov 0xfffffff8(%ebp),%edi 8048418 01 d7 add %edx,%edi 804841a 01 cf add %ecx,%edi 804841c 01 df add %ebx,%edi 804841e 01 f7 add %esi,%edi 8048420 03 7d fc add 0xfffffffc(%ebp),%edi 8048423 8b 45 f8 mov 0xfffffff8(%ebp),%eax 8048426 01 d0 add %edx,%eax 8048428 89 45 fc mov %eax,0xfffffffc(%ebp) 804842b 01 4d fc add %ecx,0xfffffffc(%ebp) 804842e 01 5d fc add %ebx,0xfffffffc(%ebp) 8048431 01 75 fc add %esi,0xfffffffc(%ebp) 8048434 01 7d fc add %edi,0xfffffffc(%ebp) 8048437 8d 65 ec lea 0xffffffec(%ebp),%esp 804843a 5b pop %ebx 804843b 5e pop %esi 804843c 5f pop %edi 804843d c9 leave 804843e c3 ret 804843f 90 nop
이 실험으로는 5개인데, eax레지스터가 덧셈할때 사용되어서,, 덧셈부분을 주석처리 하면...
08048398 8048398 55 push %ebp 8048399 89 e5 mov %esp,%ebp 804839b 83 ec 04 sub $0x4,%esp 804839e 57 push %edi 804839f 56 push %esi 80483a0 53 push %ebx 80483a1 b8 01 00 00 00 mov $0x1,%eax 80483a6 ba 02 00 00 00 mov $0x2,%edx 80483ab b9 03 00 00 00 mov $0x3,%ecx 80483b0 bb 04 00 00 00 mov $0x4,%ebx 80483b5 be 05 00 00 00 mov $0x5,%esi 80483ba bf 06 00 00 00 mov $0x6,%edi 80483bf c7 45 fc 07 00 00 00 movl $0x7,0xfffffffc(%ebp) 80483c6 8d 65 f0 lea 0xfffffff0(%ebp),%esp 80483c9 5b pop %ebx 80483ca 5e pop %esi 80483cb 5f pop %edi 80483cc c9 leave 80483cd c3 ret 80483ce 90 nop 80483cf 90 nop
이렇게.. 6개 까지도 가능하지요..
더 쓰고 싶다면 어셈블리로... MMX레지스터 같은 넘을 활용하는 방법도 있겠지요..
ps. 테스트환경 gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
.
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
Re: register변수의 수는 몇개까지 쓸수 있나요?
테스트를 해봤는데,
main(){
register int a =1;
register int b =2;
register int c =3;
register int d =4;
register int e =5;
register int f =6;
register int g =7;
a = b+c+d+e+f+g;
b = a+ c+d+e+f+g;
c = a+b+ d+e+f+g;
d = a+b+c+ e+f+g;
e = a+b+c+d+ f+g;
f = a+b+c+d+e+ g;
g = a+b+c+d+e+f;
}
이런 어셈블리 코드를 만들어 내는군요
음 제가 7개의 레지스터 변수를 만들었는데,
스택으로 들어가는 것은 2개이고 나머지
804839b 83 ec 08 sub $0x8,%esp
(스택 포인터가 8바이트 빼진것...)
80483a8 ba 02 00 00 00 mov $0x2,%edx
80483ad b9 03 00 00 00 mov $0x3,%ecx
80483b2 bb 04 00 00 00 mov $0x4,%ebx
80483b7 be 05 00 00 00 mov $0x5,%esi
80483bc bf 06 00 00 00 mov $0x6,%edi
5개는 요렇게 들어가네요..
그런데 한가지 잼있는 사실은,,,
분명히 a부터 레지스터 변수로 지정을 했는데
컴파일러가 만들어낸 코드는 b~f까지가 레지스터 변수로
선언되었네요..
08048398
8048398 55 push %ebp
8048399 89 e5 mov %esp,%ebp
804839b 83 ec 08 sub $0x8,%esp
804839e 57 push %edi
804839f 56 push %esi
80483a0 53 push %ebx
80483a1 c7 45 f8 01 00 00 00 movl $0x1,0xfffffff8(%ebp)
80483a8 ba 02 00 00 00 mov $0x2,%edx
80483ad b9 03 00 00 00 mov $0x3,%ecx
80483b2 bb 04 00 00 00 mov $0x4,%ebx
80483b7 be 05 00 00 00 mov $0x5,%esi
80483bc bf 06 00 00 00 mov $0x6,%edi
80483c1 c7 45 fc 07 00 00 00 movl $0x7,0xfffffffc(%ebp)
80483c8 8d 04 11 lea (%ecx,%edx,1),%eax
80483cb 89 45 f8 mov %eax,0xfffffff8(%ebp)
80483ce 01 5d f8 add %ebx,0xfffffff8(%ebp)
80483d1 01 75 f8 add %esi,0xfffffff8(%ebp)
80483d4 01 7d f8 add %edi,0xfffffff8(%ebp)
80483d7 8b 45 fc mov 0xfffffffc(%ebp),%eax
80483da 01 45 f8 add %eax,0xfffffff8(%ebp)
80483dd 8b 55 f8 mov 0xfffffff8(%ebp),%edx
80483e0 01 ca add %ecx,%edx
80483e2 01 da add %ebx,%edx
80483e4 01 f2 add %esi,%edx
80483e6 01 fa add %edi,%edx
80483e8 03 55 fc add 0xfffffffc(%ebp),%edx
80483eb 8b 4d f8 mov 0xfffffff8(%ebp),%ecx
80483ee 01 d1 add %edx,%ecx
80483f0 01 d9 add %ebx,%ecx
80483f2 01 f1 add %esi,%ecx
80483f4 01 f9 add %edi,%ecx
80483f6 03 4d fc add 0xfffffffc(%ebp),%ecx
80483f9 8b 5d f8 mov 0xfffffff8(%ebp),%ebx
80483fc 01 d3 add %edx,%ebx
80483fe 01 cb add %ecx,%ebx
8048400 01 f3 add %esi,%ebx
8048402 01 fb add %edi,%ebx
8048404 03 5d fc add 0xfffffffc(%ebp),%ebx
8048407 8b 75 f8 mov 0xfffffff8(%ebp),%esi
804840a 01 d6 add %edx,%esi
804840c 01 ce add %ecx,%esi
804840e 01 de add %ebx,%esi
8048410 01 fe add %edi,%esi
8048412 03 75 fc add 0xfffffffc(%ebp),%esi
8048415 8b 7d f8 mov 0xfffffff8(%ebp),%edi
8048418 01 d7 add %edx,%edi
804841a 01 cf add %ecx,%edi
804841c 01 df add %ebx,%edi
804841e 01 f7 add %esi,%edi
8048420 03 7d fc add 0xfffffffc(%ebp),%edi
8048423 8b 45 f8 mov 0xfffffff8(%ebp),%eax
8048426 01 d0 add %edx,%eax
8048428 89 45 fc mov %eax,0xfffffffc(%ebp)
804842b 01 4d fc add %ecx,0xfffffffc(%ebp)
804842e 01 5d fc add %ebx,0xfffffffc(%ebp)
8048431 01 75 fc add %esi,0xfffffffc(%ebp)
8048434 01 7d fc add %edi,0xfffffffc(%ebp)
8048437 8d 65 ec lea 0xffffffec(%ebp),%esp
804843a 5b pop %ebx
804843b 5e pop %esi
804843c 5f pop %edi
804843d c9 leave
804843e c3 ret
804843f 90 nop
이 실험으로는 5개인데, eax레지스터가 덧셈할때
사용되어서,, 덧셈부분을 주석처리 하면...
08048398
8048398 55 push %ebp
8048399 89 e5 mov %esp,%ebp
804839b 83 ec 04 sub $0x4,%esp
804839e 57 push %edi
804839f 56 push %esi
80483a0 53 push %ebx
80483a1 b8 01 00 00 00 mov $0x1,%eax
80483a6 ba 02 00 00 00 mov $0x2,%edx
80483ab b9 03 00 00 00 mov $0x3,%ecx
80483b0 bb 04 00 00 00 mov $0x4,%ebx
80483b5 be 05 00 00 00 mov $0x5,%esi
80483ba bf 06 00 00 00 mov $0x6,%edi
80483bf c7 45 fc 07 00 00 00 movl $0x7,0xfffffffc(%ebp)
80483c6 8d 65 f0 lea 0xfffffff0(%ebp),%esp
80483c9 5b pop %ebx
80483ca 5e pop %esi
80483cb 5f pop %edi
80483cc c9 leave
80483cd c3 ret
80483ce 90 nop
80483cf 90 nop
이렇게.. 6개 까지도 가능하지요..
더 쓰고 싶다면 어셈블리로...
MMX레지스터 같은 넘을 활용하는
방법도 있겠지요..
ps. 테스트환경
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
Re^2: 감사합니다.. ^^ (null)
.
댓글 달기