Delphi XE2组装
发布时间:2020-12-15 09:11:07 所属栏目:大数据 来源:网络整理
导读:我有以下功能在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
我有以下功能在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; 我不太了解装配.问题是什么? 解决方法
我完全同意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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |