procedure TBits.SetBit(Index: Integer; Value: Boolean); assembler;
asm
        CMP     Index,[EAX].FSize
        JAE     @@Size@@1:    MOV     EAX,[EAX].FBits
        OR      Value,Value
        JZ      @@2
        BTS     [EAX],Index
        RET@@2:    BTR     [EAX],Index
        RET@@Size: CMP     Index,0
        JL      TBits.Error
        PUSH    Self
        PUSH    Index
        PUSH    ECX {Value}
        INC     Index
        CALL    TBits.SetSize
        POP     ECX {Value}
        POP     Index
        POP     Self
        JMP     @@1
end;
还有这一段。谢谢

解决方案 »

  1.   

    很简单呀,是检查Index的索引值是否在数组范围,否则引发一个TBitsError的错误。
      

  2.   

    FSize 应该是TBits的私有成员吧.
    [EAX]通常是第一个参数,不过在面向对象的编程语言中,第一个参数隐含为self(pascal) or this(c++);因此[EAX].FSize 应该是self.FSize的意思.
      

  3.   

    function TBits.GetBit(Index: Integer): Boolean; assembler;
    asm
            CMP    Index,[EAX].FSize
            JAE    TBits.Error
            MOV    EAX,[EAX].FBits
            BT      [EAX],Index
            SBB    EAX,EAX
            AND    EAX,1
    end;
    请高人写出这段代码每一句的意义。
    在 Classes.pas 的2431行   
      

  4.   

      function TBits.GetBits(Index: Integer): Boolean;
      begin
        if Index >= FSize then
          this.Error
        else
        begin
          Result := FBits[Index];
        end;
      end;这里,FBits是一段Binary数据,程序中的
      MOV EAX,[EAX].FBits是让EAX指向FBits的地址。
      BT [EAX], Index 是测试FBits中的第Index位(Bit) 是否为1如是,则CF(CPU中的标志位置为1)
      SBB EAX,EAX,很明显是让EAX := EAX-EAX,你以为结果是0吗?错,还带个进位呢。因此结果取决于CF标志。如是CF为1则,EAX为FFFFFFFF,否则为0
      AND EAX,1 则取EAX最低位。让其结果不为1就为0.
    OK