Delphi+Asm-Tbitsクラスの学習
2494 ワード
技術交流、DH解説.
D 2010のclassesにはTbitsクラスがあり、このクラスは主にビット操作である.
このクラスには方法がありません.property Bits[Index:Integer]:Boolean read GetBit write SetBit;default;この属性は、あるビットを読み出して設定するものである.どうやって実現したか見てみましょう
ここでは、BTR、BTS、BT、SBB等のビットオペレータを発見する.私たちは999999の中でどれだけ1つあるか計算したことがあるのではないでしょうか.当時、私たちが使っていた方法はシフトしていましたが、私たちは今方法を変えていますか?
すべて直接位置合わせ操作である.BTRとBTSの役割は上記の私の注釈に書いたように、私は今他の例を皆さんに見せていません.Tbits類は純潔なので、他のバージョンで使えます.
DHです.
D 2010のclassesにはTbitsクラスがあり、このクラスは主にビット操作である.
TBits = class
private
FSize: Integer;
FBits: Pointer;
procedure Error;
procedure SetSize(Value: Integer);
procedure SetBit(Index: Integer; Value: Boolean);
function GetBit(Index: Integer): Boolean;
public
destructor Destroy; override;
function OpenBit: Integer;
property Bits[Index: Integer]: Boolean read GetBit write SetBit; default;
property Size: Integer read FSize write SetSize;
end;
このクラスには方法がありません.property Bits[Index:Integer]:Boolean read GetBit write SetBit;default;この属性は、あるビットを読み出して設定するものである.どうやって実現したか見てみましょう
// Eax Self
procedure TBits.SetBit(Index: Integer; Value: Boolean); assembler;
asm
CMP Index,[EAX].FSize // Indx>=Size then
JAE @@Size
@@1: MOV EAX,[EAX].FBits
OR Value,Value
JZ @@2
BTS [EAX],Index // Eax Index CF, Eax index =1;
RET
@@2: BTR [EAX],Index // Eax Index CF, Eax index =0;
RET
@@Size: CMP Index,0 //if index <0 then Error
JL TBits.Error
PUSH Self //push [eax]
PUSH Index
PUSH ECX {Value}
INC Index
CALL TBits.SetSize
POP ECX {Value}
POP Index
POP Self
JMP @@1
end;
function TBits.GetBit(Index: Integer): Boolean; assembler;
asm
CMP Index,[EAX].FSize
JAE TBits.Error
MOV EAX,[EAX].FBits
BT [EAX],Index // eax Index CF
SBB EAX,EAX //eax - (eax + CF)
AND EAX,1 // Eax
end;
ここでは、BTR、BTS、BT、SBB等のビットオペレータを発見する.私たちは999999の中でどれだけ1つあるか計算したことがあるのではないでしょうか.当時、私たちが使っていた方法はシフトしていましたが、私たちは今方法を変えていますか?
Function _1Bits(ANum: Integer): Integer;
asm
xor edx,edx //
xor ecx,ecx // 1
@@nLoop:
cmp edx,32 // 32
je @@nExit
bt eax,edx
jnc @@nNoInc // if CF = 0 then
inc ecx
@@nNoInc:
inc edx
jmp @@nLoop
@@nExit:
mov eax,ecx
end;
すべて直接位置合わせ操作である.BTRとBTSの役割は上記の私の注釈に書いたように、私は今他の例を皆さんに見せていません.Tbits類は純潔なので、他のバージョンで使えます.
DHです.