2010-07-22 4 views
2

델파이에서 인라인 어셈블리 프로그래밍을 배우려고합니다.이 목적을 달성하기 위해 this article 매우 유용합니다.긴 문자열을 반환하는 Delphi 어셈블리 함수

이제는 긴 문자열, 특히 AnsiString (간단히하기 위해)을 반환하는 어셈블리 함수를 작성하고 싶습니다. 나는

를 작성했습니다
function myfunc: AnsiString; 
asm 
    // eax = @result 
    mov edx, 3 
    mov ecx, 1252 
    call [email protected] 
    mov [eax + 0], ord('A') 
    mov [eax + 1], ord('B') 
    mov [eax + 2], ord('C') 
end; 

설명 :

문자열을 반환하는 함수는 함수의 시작 부분에, 눈에 보이지 않는 var result: AnsiString (이 경우) 매개 변수를 가지고 있으므로, eax는 결과 문자열의 주소를 보유해야 . 그런 다음 edxecx을 각각 3과 1252로 설정 한 다음 System._LStrSetLength으로 전화하십시오. 3 (= 바이트 문자) 문자열의 새 길이이며 1252 표준 windows-1252 코드 페이지입니다 실제로, 나는

_LStrSetLength(@result, 3, 1252) 

을한다.

그런 다음 eaxthe address of the first character of the string이라는 것을 알고 간단히 문자열을 "ABC"로 설정합니다. 하지만 그것은 작동하지 않습니다 - 그것은 나에게 말도 안되는 데이터 또는 EAccessViolation을 제공합니다. 문제가 무엇입니까?

업데이트

이제 우리는 하나가 NewAnsiString 하나를 사용 myfunc 두 겉으로 작업을 구현, LStrSetLength을 사용했다. 델파이의 문자열 처리 (참조 계산, 자동 해제 등)가 엉망이되지 않는다는 의미에서 두 가지가 모두 올바른지 궁금합니다.

+0

Delphi/Asm 관련 질문에 대해서는 Embarcadero의 BASM 포럼도 유용합니다. 문자열로 작업하면이 스레드에도 흥미가있을 수 있습니다. http://forums.embarcadero.com/thread.jspa?threadID=20231 – PhiS

답변

3

당신은 어떤 종류의 사용할 수 있습니다

그것은 '210'문자열을 반환합니다

function myfunc: AnsiString; 
asm 
    push eax // save @result 
    call [email protected] 
    mov eax,3     {Length} 
{$ifdef UNICODE} 
    mov edx,1252 // code page for Delphi 2009/2010 
{$endif} 
    call [email protected] 
    pop edx 
    mov [edx],eax 
    mov [eax],$303132 
end; 

을 ... 그리고 그것은 항상 {$ IFDEF 유니 코드} 퍼팅의 좋은 생각에 차단 이전 A.Bouchez의 우수한 도움으로 2009 년

+0

이것은 작동합니다. 코드를 올바르게 이해하면'@ result'는 고정되어 있으며 문자열 자체의 포인터 인 포인터에 대한 포인터이므로 문자열의 첫 번째 문자는 개념적으로'(@result) ^^'이며 '(@result) ^'? –

+0

사실. 여기에 요점이 있습니다. –

+0

호출 할 함수에 대해 NewAnsiString을 호출하면 여기서 메모리 누수가 발생합니다. LStrSetLength를 호출하는 것이 가장 좋은 옵션입니다. 결과 문자열이 ''이면 NewAnsiString을, 결과 문자열에 이미 문자가 포함되어 있으면 ReallocMem을 호출합니다. ReallocMem은 결과에 저장된 이전 데이터를 이동하므로 LStrClr에서 NewAnsiString을 사용하는 것이 가장 빠릅니다. System.pas의 StringOfChar() 함수 코드를 참조하십시오. 예제를 업데이트했습니다. –

1

에 델파이의 버전과 호환 코드를 가지고, 나는 LStrSetLength 사용, 내 자신의 코드를 수정 관리 :

,732 10
관련 문제