【问题标题】:Invalid combination of opcode and operands FPC操作码和操作数 FPC 的组合无效
【发布时间】:2014-05-30 22:48:02
【问题描述】:

我正在尝试在汇编程序中实现函数 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;

请帮帮我

【问题讨论】:

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

标签: assembly opcode fpc operand operands


【解决方案1】:

20 年的 16 位汇编器不能用于 FPC。(*) 一般使用 Stringssysutils 单元中的 strpos,两者FPC 自带的。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-23
    • 2015-07-31
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    相关资源
    最近更新 更多