【发布时间】:2012-02-17 00:40:32
【问题描述】:
我有以下在 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,[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;
我不太了解组装。有什么问题?
【问题讨论】:
-
顺便说一下,这个 asm 代码的编码非常糟糕。例如,如果 s 字符串只是 Ch 的一个字符,它将生成一个 AV,恕我直言。忘记它,并在他的回答中使用 Mike 提供的第二个帕斯卡版本。
-
我投票决定关闭,因为它的定义非常狭窄。尽管有人似乎已经明确回答了这个问题,这完全令人印象深刻,但这种问题对网站的价值就像零一样。
标签: delphi assembly delphi-xe2 delphi-2006 basm