델파이 어셈블리를 반환하는 함수 긴 문자열
문제
하시려면,인라인이 어셈블리 프로그래밍 델파이,그리고 이를 위해 내가 발견 이 문서 매우 도움이 된다.
지금 내가 원하는 작성하 어셈블리를 반환하는 함수 긴 문자열,구체적으로 AnsiString
(단순).내가 기록
function myfunc: AnsiString;
asm
// eax = @result
mov edx, 3
mov ecx, 1252
call System.@LStrSetLength
mov [eax + 0], ord('A')
mov [eax + 1], ord('B')
mov [eax + 2], ord('C')
end;
설명:
을 반환하는 함수 문자열을 보이지 않는 var result: AnsiString
(이 경우)매개변수,그래서,의 시작 부분에서 기능 eax
을 보유해야의 주소는 결과 문자열입니다.다음 edx
고 ecx
3 1252,각각,그리고 그런 다음 전화 System._LStrSetLength
.에서 효과,나
_LStrSetLength(@result, 3, 1252)
3 은 새로운 문자열의 길이(문자=바이트)및 1252 표준 windows-1252 codepage.
그는 것을 알고, eax
가 주소의 첫 번째 문자의 문자열, 에,나는 단순히 설정한 문자열"ABC".하지만 그것은 작동하지 않습니다-그것은 나에게 말도 안되는 데이터 또는 EAccessViolation.문제는 무엇입니까?
업데이트
이제 우리는 겉보기업 구현 myfunc
, 한 채용 NewAnsiString
한 채용 LStrSetLength
.내가 도울 수 없어요 하지만 궁금해하는 경우 그들 모두가 올바른다는 의미에서 그들은 엉망하지 않습니다.델파이의 내부의 처리 문자열은(참조,계산 오토 확보,etc.).
해결책
당신이 어떤 종류의 사용:
function myfunc: AnsiString;
asm
push eax // save @result
call system.@LStrClr
mov eax,3 {Length}
{$ifdef UNICODE}
mov edx,1252 // code page for Delphi 2009/2010
{$endif}
call system.@NewAnsiString
pop edx
mov [edx],eax
mov [eax],$303132
end;
그것이 반환됩니다'210'문자열을...
그리고 그것은 항상의 좋은 아이디어를 넣어{$ifdef 유니코드}블록의 코드와 호환되는 버전의 델파이 전 2009.
다른 팁
우수한 도 A.Bouchez,내가 관리하고 올바른 나의 자신의 코드,용 LStrSetLength
:
function myfunc: AnsiString;
asm
push eax
// eax = @result
mov edx, 3
mov ecx, 1252
call System.@LStrSetLength
pop eax
mov ecx, [eax]
mov [ecx], 'A'
mov [ecx] + 1, 'B'
mov [ecx] + 2, 'C'
end;