E2107操作数大小不匹配

时间:2015-02-03 12:08:25

标签: delphi assembly delphi-xe7

我使用这个功能,因为D2007我上网了,不记得在哪里。

但是现在在XE7中它返回一个编译错误:

  

" E2107操作数大小不匹配"

    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?

我该怎么办?

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

如果你想继续前进,你可以重新实现这样的功能:

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;