此处所列的文章均是我自己从国外的网站摘抄并翻译的,由于英文水平有限,里面肯定有不少错漏.翻译这些东西没有其他的什么用途,只是提高自己的英语阅读能力和编程技术水平而已     

TStringList阅读

function TStrings.GetNameValueSeparator: Char; //默认的NameValueSeparator是"=
"begin
  if not (sdNameValueSeparator in FDefined) then
    NameValueSeparator := '=';
  Result := FNameValueSeparator;
end;

procedure TStrings.SetNameValueSeparator(const Value: Char);
begin
  if (FNameValueSeparator <> Value) or not (sdNameValueSeparator in FDefined) then
  begin
    Include(FDefined, sdNameValueSeparator);
    FNameValueSeparator := Value;
  end
end;

 

function TStrings.GetQuoteChar: Char; //默认的是双引号
begin
  if not (sdQuoteChar in FDefined) then
    QuoteChar := '"';
  Result := FQuoteChar;


end;procedure TStrings.SetQuoteChar(const Value: Char);
begin
  if (FQuoteChar <> Value) or not (sdQuoteChar in FDefined) then
  begin
    Include(FDefined, sdQuoteChar);
    FQuoteChar := Value;
  end

 

function TStrings.GetDelimiter: Char;
begin
  if not (sdDelimiter in FDefined) then
    Delimiter := ',';
  Result := FDelimiter;
end;
end;

 

procedure TStrings.SetDelimiter(const Value: Char);
begin
  if (FDelimiter <> Value) or not (sdDelimiter in FDefined) then
  begin
    Include(FDefined, sdDelimiter);
    FDelimiter := Value;
  end
end;

默认的是逗号。

 

function TStrings.GetQuoteChar: Char;
begin
  if not (sdQuoteChar in FDefined) then
    QuoteChar := '"';
  Result := FQuoteChar;
end;

procedure TStrings.SetQuoteChar(const Value: Char);
begin
  if (FQuoteChar <> Value) or not (sdQuoteChar in FDefined) then
  begin
    Include(FDefined, sdQuoteChar);
    FQuoteChar := Value;
  end
end;

 

function XXXStrLen(const Str: PChar): Integer; assembler;  //求出字符串的长度。
asm
        MOV     EDX,EDI
        MOV     EDI,EAX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        NOT     ECX
        dec     ECX
        MOV     EAX,ECX
        MOV     EDI,EDX
end;

 


SCAS是在检索目标字符串;REPNE/REPNZ是重复前缀(CX<>0 且ZF=0重复执行字符串指令),类似的还有REPE/REPZ、REP
  ax/al   搜索数据  
  es:di   目标串  
  cx         串长度  
  df         方向标志

 http://student.zjzk.cn/course_ware/caiweb/huibian/Chap2/chap2-6-1.htm

 

格式:REPE(或REPZ)String Primitive
其中String Primitive可为CMPS或SCAS指令。
执行的操作:
1)如(CX)=0或ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行。
2)(CX)←(CX)-1

3)执行其后的串指令
4)重复1)—3)
实际上REPE和REPZ是完全相同的,只是表达的方式不同而已。与REP相比,除满足(CX)=0的条件可结束操作外,还增加了ZF=0的条件。也不是说,只要两数相等就可继续比较,如果遇到两数不相等时可提前结束操作。

 

格式:REPNE(或REPNZ)String Primitive
其中String Primitive可为CMPS和SCAS指令。
执行的操作:
除退出条件为(CX)=0或ZF=1外,其他操作与REPE完全相同。也就是说,只要两数比较不相等,就可继续执行串处理指令,如某次两数比较相等或(CX)=0时,就可结束操作。

 

格式:CMPS SRC,DST
      CMPSB(字节)
      CMPSW(字)

执行的操作:
1)((SI))-((DI))
2)字节操作:(SI)←(SI)±1,(DI)←(DI)±1
   字操作:(SI)
←(SI)±2,(DI)←(DI)±2
指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果置条件码,指令的其他特性和MOVS指令的规定相同。

 

function StrLen(const Str: PChar): Cardinal; assembler;
asm
        MOV     EDX,EDI
        MOV     EDI,EAX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        MOV     EAX,0FFFFFFFEH
        SUB     EAX,ECX
        MOV     EDI,EDX
end;

function StrEnd(const Str: PChar): PChar; assembler;
asm
        MOV     EDX,EDI
        MOV     EDI,EAX
        MOV     ECX,0FFFFFFFFH
        XOR     AL,AL
        REPNE   SCASB
        LEA     EAX,[EDI-1]
        MOV     EDI,EDX
end;

 

function StrAlloc(Size: Cardinal): PChar;
begin
  Inc(Size, SizeOf(Cardinal));
  GetMem(Result, Size);
  Cardinal(Pointer(Result)^) := Size;
  Inc(Result, SizeOf(Cardinal));
end;

function StrBufSize(const Str: PChar): Cardinal;
var
  P: PChar;
begin
  P := Str;
  Dec(P, SizeOf(Cardinal));
  Result := Cardinal(Pointer(P)^) - SizeOf(Cardinal);
end;

 

function StrNew(const Str: PChar): PChar;
var
  Size: Cardinal;
begin
  if Str = nil then Result := nil else
  begin
    Size := StrLen(Str) + 1;
    Result := StrMove(StrAlloc(Size), Str, Size);
  end;
end;

procedure StrDispose(Str: PChar);
begin
  if Str <> nil then
  begin
    Dec(Str, SizeOf(Cardinal));
    FreeMem(Str, Cardinal(Pointer(Str)^));
  end;
end;

posted @ 2010-11-20 08:46  AppleAndPear  阅读(242)  评论(0编辑  收藏  举报