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;