E2107 操作数大小不匹配

E2107 Operand size mismatch

我从D2007开始使用这个功能我在网上得到它,不记得在哪里。

但现在在XE7中它return编译错误:

"E2107 Operand size mismatch"

    function FastCharPos(const aSource : string; const C: Char; StartPos : Integer) : Integer;
    var
        L : Integer;
    begin
        //If this assert failed, it is because you passed 0 for StartPos, lowest value is 1 !!
      Assert(StartPos > 0);

        Result := 0;
      L := Length(aSource);
        if L = 0 then exit;
      if StartPos > L then exit;
      Dec(StartPos);
        asm
          PUSH EDI                 //Preserve this register

          mov  EDI, aSource        //Point EDI at aSource
          add  EDI, StartPos
                mov  ECX, L              //Make a note of how many chars to search through
                sub  ECX, StartPos
                mov  AL,  C              //and which char we want :Error -"E2107 Operand size mismatch"
        @Loop:
                cmp  Al, [EDI]           //compare it against the SourceString
          jz   @Found
          inc  EDI
                dec  ECX
                jnz  @Loop
          jmp  @NotFound
        @Found:
          sub  EDI, aSource        //EDI has been incremented, so EDI-OrigAdress = Char pos !
          inc  EDI
          mov  Result,   EDI
        @NotFound:

          POP  EDI
        end;
    end;

function FastCharPosNoCase(const aSource : string; C: Char; StartPos : Integer) : Integer;
var
  L                           : Integer;
begin
  Result := 0;
    L := Length(aSource);
  if L = 0 then exit;
    if StartPos > L then exit;
  Dec(StartPos);
    if StartPos < 0 then StartPos := 0;

  asm
            PUSH EDI                 //Preserve this register
            PUSH EBX
      mov  EDX, GUpcaseLUT

      mov  EDI, aSource        //Point EDI at aSource
            add  EDI, StartPos
            mov  ECX, L              //Make a note of how many chars to search through
      sub  ECX, StartPos

            xor  EBX, EBX
            mov  BL,  C              //:Error -"E2107 Operand size mismatch"
      mov  AL, [EDX+EBX]
        @Loop:
            mov  BL, [EDI]
      inc  EDI
      cmp  Al, [EDX+EBX]
            jz   @Found
      dec  ECX
      jnz  @Loop
      jmp  @NotFound
        @Found:
      sub  EDI, aSource        //EDI has been incremented, so EDI-OrigAdress = Char pos !
      mov  Result,   EDI
        @NotFound:

      POP  EBX
            POP  EDI
    end;
end;

XE7 win32更新这两个功能需要什么?

我必须做什么?

谢谢。

此代码是为 pre Unicode Delphi 编写的,其中 CharAnsiChar 的别名,8 位字符类型。在 Delphi 2009 及更高版本中,CharWideChar 16 位字符类型的别名。

错误消息的原因是代码旨在对 8 位字符元素进行操作,但您提供的是 16 位操作数。运算符需要 8 位操作数,但您提供了 16 位操作数。

Char 更改为 AnsiChar 以使此代码在所有版本的 Delphi 上按预期编译和运行。

话虽如此,我建议您停止使用此代码。而是使用 Pos。通常,最好使用内置库函数。

您应该停止对字符串例程使用旧版本的汇编程序,并使用内置库函数。

如果你想赶快继续,你可以像这样重新实现你的函数:

function FastCharPos(const aSource: string; const C: Char; StartPos: Integer): Integer; inline;
begin
  Result := Pos(C, aSource, StartPos);
end;

function FastCharPosNoCase(const aSource: string; C: Char; StartPos: Integer): Integer; inline;
begin
  Result := Pos(AnsiUppercase(C), AnsiUppercase(aSource), StartPos);
end;