由于我要对字符串进行进一步的处理。所以求教能实现Pos函数一样功能的代码。谢谢!

解决方案 »

  1.   

    晕,不能用POS吗,还要自己写代码啊
      

  2.   

    真是晕,直接用不就得了,Pos在VCL中是用汇编写得,你能写出效率更高得吗??
      

  3.   

    以前我在一本书上见有这类代码,用pascal写的。
      

  4.   

    晕,不能用POS吗,还要自己写代码啊
      

  5.   

    delphi 自帶代碼:
    procedure       _Pos{ substr : ShortString; s : ShortString ) : Integer};
    asm
    {     ->EAX     Pointer to substr               }
    {       EDX     Pointer to string               }
    {     <-EAX     Position of substr in s or 0    }        PUSH    EBX
            PUSH    ESI
            PUSH    EDI        MOV     ESI,EAX { Point ESI to substr           }
            MOV     EDI,EDX { Point EDI to s                }        XOR     ECX,ECX { ECX = Length(s)               }
            MOV     CL,[EDI]
            INC     EDI             { Point EDI to first char of s  }        PUSH    EDI             { remember s position to calculate index        }        XOR     EDX,EDX { EDX = Length(substr)          }
            MOV     DL,[ESI]
            INC     ESI             { Point ESI to first char of substr     }        DEC     EDX             { EDX = Length(substr) - 1              }
            JS      @@fail  { < 0 ? return 0                        }
            MOV     AL,[ESI]        { AL = first char of substr             }
            INC     ESI             { Point ESI to 2'nd char of substr      }        SUB     ECX,EDX { #positions in s to look at    }
                            { = Length(s) - Length(substr) + 1      }
            JLE     @@fail
    @@loop:
            REPNE   SCASB
            JNE     @@fail
            MOV     EBX,ECX { save outer loop counter               }
            PUSH    ESI             { save outer loop substr pointer        }
            PUSH    EDI             { save outer loop s pointer             }        MOV     ECX,EDX
            REPE    CMPSB
            POP     EDI             { restore outer loop s pointer  }
            POP     ESI             { restore outer loop substr pointer     }
            JE      @@found
            MOV     ECX,EBX { restore outer loop counter    }
            JMP     @@loop@@fail:
            POP     EDX             { get rid of saved s pointer    }
            XOR     EAX,EAX
            JMP     @@exit@@found:
            POP     EDX             { restore pointer to first char of s    }
            MOV     EAX,EDI { EDI points of char after match        }
            SUB     EAX,EDX { the difference is the correct index   }
    @@exit:
            POP     EDI
            POP     ESI
            POP     EBX
    end;
      

  6.   

    公布一下,看看是不是比POS好啊!
    接分!