【发布时间】: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