델파이에서 인라인 어셈블리 프로그래밍을 배우려고합니다.이 목적을 달성하기 위해 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
는 결과 문자열의 주소를 보유해야 . 그런 다음 edx
과 ecx
을 각각 3과 1252로 설정 한 다음 System._LStrSetLength
으로 전화하십시오. 3 (= 바이트 문자) 문자열의 새 길이이며 1252 표준 windows-1252 코드 페이지입니다 실제로, 나는
_LStrSetLength(@result, 3, 1252)
을한다.
그런 다음 eax
이 the address of the first character of the string이라는 것을 알고 간단히 문자열을 "ABC"로 설정합니다. 하지만 그것은 작동하지 않습니다 - 그것은 나에게 말도 안되는 데이터 또는 EAccessViolation을 제공합니다. 문제가 무엇입니까?
업데이트
이제 우리는 하나가NewAnsiString
하나를 사용
myfunc
두 겉으로 작업을 구현,
LStrSetLength
을 사용했다. 델파이의 문자열 처리 (참조 계산, 자동 해제 등)가 엉망이되지 않는다는 의미에서 두 가지가 모두 올바른지 궁금합니다.
Delphi/Asm 관련 질문에 대해서는 Embarcadero의 BASM 포럼도 유용합니다. 문자열로 작업하면이 스레드에도 흥미가있을 수 있습니다. http://forums.embarcadero.com/thread.jspa?threadID=20231 – PhiS