delphi $ IfNDEF命令

Jun*_*oor 0 delphi

对不起,我知道这是一个非常无聊的问题,但有人可以看到这段代码,并解释这段代码应该做什么,并且delphi 7一直给我错误的线路开始说明期待:或者,

{$IFDEF CRYPT_BLOCK}
  nested blocks not allowed!
{$ENDIF}
{$DEFINE CRYPT_BLOCK}
{$IFOPT O+}
  {$DEFINE SAVE_OPT}
{$ENDIF}
{$O-}
{$IfNDef UNSAFE_CRYPT}
begin
{$ENDIF}
asm db   $EB, $06, $EB, $FC, $EB, $FC, $FF, $F8 end;
Run Code Online (Sandbox Code Playgroud)

谢谢

Cos*_*und 9

一步步;

{$IFDEF CRYPT_BLOCK}
  nested blocks not allowed!
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

我假设这个代码是以某种方式进行的{$INCLUDE}.此代码不希望包含两次,因此它(稍后)将定义预编译器符号CRYPT_BLOCK; 上面的代码测试是否定义了符号{$IFDEF CRYPT_BLOCK},如果是,那么它会执行不会编译的东西(nested blocks not allowed!).当程序员看到她会知道她已经{$INCLUDE}两次这样的东西.

{$DEFINE CRYPT_BLOCK}
Run Code Online (Sandbox Code Playgroud)

这定义了使用上面的块测试的符号.如果编译器在没有投诉的情况下到达此处,那么该符号尚未定义.

{$IFOPT O+}
  {$DEFINE SAVE_OPT}
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

检查是否启用了编译器优化.如果是,则SAVE_OPT定义符号,以便可以恢复编译器选项.当我们看到这一点时,我们假设代码将改变{$O}编译器选项.

{$O-}
Run Code Online (Sandbox Code Playgroud)

果然,现在已禁用优化.

{$IfNDef UNSAFE_CRYPT}
begin
{$ENDIF}
Run Code Online (Sandbox Code Playgroud)

如果UNSAFE_CRYPT未定义符号,则让编译器查看begin关键字.

asm db   $EB, $06, $EB, $FC, $EB, $FC, $FF, $F8 end;
Run Code Online (Sandbox Code Playgroud)

这只是一些可怕的汇编程序代码; 有人想"混淆"代码; 不是一个好主意.前两个字节($EB,$06)是完全在所有这些代码之后的相对跳转.换句话说,你几乎可以在任何地方包含这一系列的程序集,CPU只会跳过它.然后是一系列奇怪的跳跃,第二$Eb $FC个跳转到第一个跳跃的位置,一个跳跃.最后两个字节($FF,$F8)实际上没有任何意义(它们不是有效的Intel x86指令)所以我假设这是有效负载.