다음 함수는 Delphi 2006에서 작동하지만 Delphi XE2에서는 RET
을 처리 할 때 액세스 위반 오류 또는 권한있는 명령어 오류가 발생합니다.Delphi XE2 어셈블리
function Q_TrimChar(const S: string; Ch: Char): string;
asm
PUSH ESI
MOV ESI,ECX
TEST EAX,EAX
JE @@qt
MOV ECX,[EAX-4]
TEST ECX,ECX
JE @@qt
PUSH EBX
PUSH EDI
MOV EBX,EAX
MOV EDI,EDX
XOR EDX,EDX
MOV EAX,ESI
CALL [email protected]
MOV EDX,EDI
MOV ECX,[EBX-4]
@@lp1: CMP DL,BYTE PTR [EBX]
JNE @@ex1
INC EBX
DEC ECX
JNE @@lp1
MOV EDX,[ESI]
JMP @@wq
@@ex1: DEC ECX
@@lp2: CMP DL,BYTE PTR [EBX+ECX]
JNE @@ex2
DEC ECX
JMP @@lp2
@@ex2: MOV EDI,[ESI]
LEA EDX,[EDI+ECX+1]
@@lp3: MOV AL,BYTE PTR [EBX+ECX]
MOV BYTE PTR [EDI+ECX],AL
DEC ECX
JNS @@lp3
@@wq: MOV EAX,[ESI]
MOV BYTE PTR [EDX],0
SUB EDX,EAX
MOV [EAX-4],EDX
POP EDI
POP EBX
POP ESI
RET
@@qt: MOV EAX,ESI
CALL [email protected]
POP ESI
end;
잘 모릅니다. 문제가 무엇입니까?
그런데이 asm 코드는 방금 코딩되었습니다. 예를 들어, s 문자열이 Ch의 한 문자 일 경우 AV, IMHO를 만듭니다. 그것을 잊어 버리고 그의 대답에 마이크가 제공 한 2 번째 파스칼 버전을 사용하십시오. –
이것이 너무 좁게 정의 되었기 때문에 나는 투표하기로 결심했다. 어떤 사람이 확실하게 대답 한 것 같아서 인상적이지만 사이트에 대한 이런 종류의 질문의 가치는 0과 같습니다. –