• Delphi Copy 函数 和 Pos函数


    1、copy(a,b,c);  -- 复制指定的字符串

    • a:就是copy源,就是一个字符串,表示你将要从a里copy一些东西,
    • b:从a中的第b位开始copy(包含第1位),
    • c:copy从第b位开始后的c个字符,

    示例: 

    m:='the fellowship of the ring'
    s:=copy(m,2,2);                           //s值为‘he’

    函数原型:

    procedure       _Copy{ s : ShortString; index, count : Integer ) : ShortString};
    asm
    {     ->EAX     Source string                   }
    {       EDX     index                           }
    {       ECX     count                           }
    {       [ESP+4] Pointer to result string        }
    
            PUSH    ESI
            PUSH    EDI
    
            MOV     ESI,EAX
            MOV     EDI,[ESP+8+4]
    
            XOR     EAX,EAX
            OR      AL,[ESI]
            JZ      @@srcEmpty
    
    {       limit index to satisfy 1 <= index <= Length(src) }
    
            TEST    EDX,EDX
            JLE     @@smallInx
            CMP     EDX,EAX
            JG      @@bigInx
    @@cont1:
    
    {       limit count to satisfy 0 <= count <= Length(src) - index + 1    }
    
            SUB     EAX,EDX { calculate Length(src) - index + 1     }
            INC     EAX
            TEST    ECX,ECX
            JL      @@smallCount
            CMP     ECX,EAX
            JG      @@bigCount
    @@cont2:
    
            ADD     ESI,EDX
    
            MOV     [EDI],CL
            INC     EDI
            REP     MOVSB
            JMP     @@exit
    
    @@smallInx:
            MOV     EDX,1
            JMP     @@cont1
    @@bigInx:
    {       MOV     EDX,EAX
            JMP     @@cont1 }
    @@smallCount:
            XOR     ECX,ECX
            JMP     @@cont2
    @@bigCount:
            MOV     ECX,EAX
            JMP     @@cont2
    @@srcEmpty:
            MOV     [EDI],AL
    @@exit:
            POP     EDI
            POP     ESI
        RET 4
    end;
    
    

     

    2、pos(a,b);   -- 取出子串a,在父串b中第一次出现的位置; 

    示例:

    pos('b','abcd');  //返回结果  2;     

    函数原型:

    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;
    

      

      

    创建时间:2020.07.05  更新时间:2020.08.17

  • 相关阅读:
    Ethical Hacking
    Ethical Hacking
    Ethical Hacking
    National Treasures HDU
    Matrix HDU
    过山车 HDU
    Jimmy’s Assignment HDU
    Card Game Cheater HDU
    Uncle Tom's Inherited Land* HDU
    50 years, 50 colors HDU
  • 原文地址:https://www.cnblogs.com/guorongtao/p/11138528.html
Copyright © 2020-2023  润新知