문제

하시려면,인라인이 어셈블리 프로그래밍 델파이,그리고 이를 위해 내가 발견 이 문서 매우 도움이 된다.

지금 내가 원하는 작성하 어셈블리를 반환하는 함수 긴 문자열,구체적으로 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 을 보유해야의 주소는 결과 문자열입니다.다음 edxecx 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;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top