我有以下功能在Delphi 2006中工作,但在Delphi XE2下,它在处理RET时会产生访问冲突错误或特权指令错误. function Q_TrimChar(const S: string; Ch: Char): string;asm PUSH ESI MOV ESI,ECX TEST EAX,EAX JE @@qt MOV ECX,[
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 System.@LStrFromPCharLen
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 System.@LStrClr
POP ESI
end;
我不太了解装配.问题是什么?
我完全同意David的建议,只需在Pascal中对此进行编码并对该答案进行投票.除非分析表明这是一个真正的瓶颈,否则实际上不需要ASM.这是两个版本.第一个更容易阅读,但第二个更有效:function Q_TrimChar(const S: string; Ch: Char): string; begin result := S; while (result <> '') and (result[1] = Ch) do Delete(Result, 1, 1); while (result <> '') and (result[Length(Result)] = Ch) do Delete(Result, Length(Result), 1); end; function Q_TrimChar(const S: string; Ch: Char): string; var First, Last : integer; begin First := 1; Last := Length(S); while (First < Last) and (S[First] = Ch) do inc(First); while (Last >= First) and (S[Last] = Ch) do Dec(Last); Result := copy(S, First, Last-First+1); end;
