Assembly 操作码和操作数FPC的组合无效
我正试图在汇编程序中实现StrPos函数。我有64位处理器和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
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吗?