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;
还有这一段。谢谢
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;
还有这一段。谢谢
[EAX]通常是第一个参数,不过在面向对象的编程语言中,第一个参数隐含为self(pascal) or this(c++);因此[EAX].FSize 应该是self.FSize的意思.
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行
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