C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[51199] Re:Re:AnsiString에서 + 연산자 소스인데 설명해 주실분 계신가요?
남병철.레조 [lezo] 1413 읽음    2007-11-10 16:48
아하~ eax가 리턴값이 저장되는 곳이군요. ^^
값으로 리턴하는 방법에 뭔가 다른 해결책이 있는것인가 했는데 그보다 스트링 합치는 효율성을
높여 놓았네요.
자세한 설명 감사합니다. ^^



Lyn 님이 쓰신 글 :
: mov     edx, this //This 포인터 operator+ 는 2개의 인자(숫자로 따지면 A+B) 를 가지므로
: 2개의 문자열이 필요합니다. 여기서는 호출시 + 의 소유자인 A를 이야기하죠. 함수로 따지면
: A->+(B) 이런식입니다. A가 소유한 + 라는 오퍼레이터가 B를 인자로 가지는거죠 호출 한 주체가 되는 A가 여기에서의 this가 됩니다.
: mov     edx, [edx]
: //뭐 별거 아닙니다 그냥 edx의 값을 edx에 넣어줍니다.
: mov     eax, ptmp
: //리턴값은 eax 에 저장되게 되어 있습니다. 포인터를 리턴받기 위해 그 포인터의 주소를 넣어 줍니다.
: mov     ecx, rhs
: //이것도 첫줄과 마찬가집니다. 파라메터로 넘어온 rhs 를 ecx에 넣어줍니다.
: mov     ecx, [ecx]
: //이것도 ecx의 값을 ecx에 넣어 줍니다.
: call    @System@@LStrCat3$qqrv
: //여기는 문자열 결합 함수를 호출하는 부분인데...
: 왜 ecx와 edx에 합칠 두개의 파라메터를 넣냐면, Fastcall 에서는 2개까지의 인자를 stack 이 아닌 edx,와 ecx를 통해 넘깁니다. 그부분을 어셈으로 구현하기 위해 this 와 rhs 를 각각 edx, ecx에 넣어주고 함수를 call 한거죠
: 리턴값은 eax 에 저장되므로, call 이 끝나는 순간 eax 에 들어있던 포인터 ptmp 가 가르키고있던 클래스의 값이 변화합니다.(리턴값을 버리기위해 호출만 해도 실제론 eax 의 값이 변화 합니다)
:
: 그러고나선 C 코드네요 ^-^;
: 그냥 결과를 리턴 합니다.
:
: 음 이정도면 설명이 되었으려나요 ^-^;
:
: 남병철.레조 님이 쓰신 글 :
: : + 연산자 처리하는데 그냥 리턴했더니 문제가 많네요 ㅎㅎ
: : 어셈 코드가 무슨 의미인지 모르겠습니다. 아시는 분은 도움을... ㅠ.ㅠ
: :
: :
: :   AnsiString __fastcall AnsiString::operator+(const AnsiString& rhs) const
: :   {
: : #if 0
: :     //!JK Per Peter S., change to push 0 onto the stack
: :     //!JK and use as the first parm
: :     //!JK need to take out double contruction (return tmp)
: : #endif
: :     AnsiString tmp;
: :     AnsiString* ptmp = &tmp;
: :     asm
: :     {
: :       mov     edx, this
: :       mov     edx, [edx]
: :       mov     eax, ptmp
: :       mov     ecx, rhs
: :       mov     ecx, [ecx]
: :       call    @System@@LStrCat3$qqrv
: :     }
: :     return tmp;
: :   }

+ -

관련 글 리스트
51178 AnsiString에서 + 연산자 소스인데 설명해 주실분 계신가요? 남병철.레조 1282 2007/11/08
51199         Re:Re:AnsiString에서 + 연산자 소스인데 설명해 주실분 계신가요? 남병철.레조 1413 2007/11/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.