Assembly 操作码和操作数FPC的组合无效

Assembly 操作码和操作数FPC的组合无效,assembly,opcode,fpc,operand,operands,Assembly,Opcode,Fpc,Operand,Operands,我正试图在汇编程序中实现StrPos函数。我有64位处理器和FPC。在编译时,会显示以下错误: function StrPos(Str1, Str2: PChar): LONGINT; assembler; asm PUSH DS CLD XOR AL,AL LES EDI,Str2 // error: asm: [les reg32, reg32] Invalid combination of opcode

我正试图在汇编程序中实现StrPos函数。我有64位处理器和FPC。在编译时,会显示以下错误:

    function StrPos(Str1, Str2: PChar): LONGINT; assembler;
    asm
        PUSH    DS
        CLD
        XOR AL,AL
        LES EDI,Str2 // error: asm: [les reg32, reg32] Invalid combination of opcode and operands
        MOV CX,0FFFFH
        REPNE   SCASB
        NOT CX
        DEC CX
        JE  @@2
        MOV DX,CX
        MOV BX,ES
        MOV DS,BX
        LES EDI,Str1 // error: asm: [les reg32, reg32] Invalid combination of opcode and operands
        // .........
    end;

请帮帮我,

20岁的16位汇编程序不能用于FPC。(*)通常使用字符串sysutils单元中的strpo,这两个单元都随FPC一起提供

对于特殊情况,可以通过使用system.indexbyte()消除对汇编程序的需求,system.indexbyte()是基本的scasb可移植内在特性


(*)严格地说,主干中有一个16位FPC后端,但我想您对此不感兴趣,因为它也不会在64位操作系统上运行。

我正在尝试找出您的目标体系结构。LES看起来你在使用16位操作系统?谁还会这样做呢?我正试图在我的64位计算机上用带有校正汇编的免费pascal ide从pascal STRINGS.PAS库编译代码,但这里有一些错误,因为代码来自为16位处理器创建的旧库。我需要重写这个函数,这样它才能正常工作。我的第一个建议是:不要在asm中编写这个函数。FPC肯定有一个字符串库吗?仅仅因为这是用asm编写的,并不意味着它会神奇地更快。使用内联asm通常会带来优化方面的损失,这很可能会淹没任何可感知的好处。突出显示的语句不是此代码的唯一问题。寄存器需要从DX更改为RDX,0FFFH不是64位,等等。MOV EDI、Str1可能会修复编译错误,但还有更多。你确定这一定是asm吗?