标签:ons 语言 osd 定位 代码 asm max 高效 cli
//在 delphi 新版中, char 已经是双字节了。故应该重新自己写一个函数,取名为 FillByte ,才无歧义。
procedure TForm1.Button2Click(Sender: TObject); // 功能,将 Buff 数组快速填充为一个值,如 65 const MaxLen = 1024; var Buff: array [0 .. MaxLen] of byte; p: PByte; i: integer; begin p := @Buff[0]; // 1 . 初学者写法。 for i := 0 to MaxLen do begin Buff[i] := 65; // 如果 Buff 是 delphi 的 string 类型 // 则 Buff[i] 会有一个定位元素的函数调用,代码效率降低了。 end; // 2. 进阶者写法,也可以称之为明白人写法。 // 此写法清晰明白地使用了指针,是常用的方法。 // 即使 Buff 为 delphi 的 string 类型,仍然高效。 for i := 0 to MaxLen do begin p^ := 65; inc(p); end; // 3. 怪异用法,这是语法特性, c 语言中也有这样的写法 // 可以少写代码,省事。效率与方法2相当。 for i := 0 to MaxLen do p[i] := 65; end; procedure TForm1.Button1Click(Sender: TObject); // 功能,将 Buff 数组快速填充为某一个值,如 65 (16 进制0x41 ) const MaxLen = 1024; var Buff: array [0 .. MaxLen] of byte; PB: PByte; PI: PInt64; D: int64; i, Count: integer; begin // 方法4,高级用法。 // 充分利用寄存器的长度,一次填充8个 Byte // 此写法综合评比最优写法。既高效,又灵活跨越各平台。 PB := @Buff[0]; PI := PInt64(PB); D := $4141414141414141; // Count := (MaxLen + 1) div 8; for i := 0 to Count - 1 do begin PI^ := D; inc(PI); end; // 填充剩余的位置 Count := (MaxLen + 1) and $7; // 等同于 MaxLen mod $7; PB := PByte(PI); for i := 0 to Count - 1 do begin PB^ := $41; inc(PB); end; end; procedure TForm1.Button3Click(Sender: TObject); // 功能,将 Buff 数组快速填充为某一个值,如 65 (16 进制 0x41 ) const MaxLen = 1024; var Buff: array [0 .. MaxLen] of byte; p: pointer; i, Count: integer; begin // 方法5 ,骨灰级写法 // 惊天地,泣鬼神,为了效率,啥也不顾了。 // 此为宇宙中效率最高写法,可惜,跨平台或有困难。 Count := (MaxLen + 1) div 4; p := @Buff[0]; asm cld; mov eax,$41414141; // 因为是32位,所以4个字节 mov ecx,count; mov edi,p; rep stosd; end; Count := (MaxLen + 1) mod 4; if Count > 0 then asm cld mov eax,$41; mov ecx,count; mov edi,p; rep stosb; end; end;
标签:ons 语言 osd 定位 代码 asm max 高效 cli
原文地址:http://www.cnblogs.com/lackey/p/6731582.html