register변수의 수는 몇개까지 쓸수 있나요?

익명 사용자의 이미지

어떤 함수 안에서 사용할수 있는 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)

익명 사용자의 이미지

.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.