我有以下功能在Delphi 2006中工作,但在Delphi XE2下,它在處理RET
時給出訪問衝突錯誤或特權指令錯誤。德爾福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,恕我直言。忘掉它,然後使用Mike提供的第二個pascal版本作爲回答。 – 2012-02-17 08:22:11
我投票結束,因爲這是如此狹義的定義。儘管有人似乎已經明確地回答了這個問題,但令人印象深刻的是,這類問題對網站的價值就像零。 – 2012-02-18 00:12:56