Delphi+Asm-Tbitsクラスの学習

2494 ワード

技術交流、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です.