7

有时我会写很短的汇编函数,比如

function SeniorBit(Value: LongWord): Integer;
asm
        OR    EAX,EAX
        JZ    @@Done
        BSR   EAX,EAX
        INC   EAX
@@Done:
end;

这似乎是内联的最佳候选人:

function SeniorBit(Value: LongWord): Integer; inline;

但 Delphi 编译器不允许这样做。为什么?


更新:

感谢 ldsandon,有一份 5.5 年前的 QC 公开报告。该报告包含一些建议(如扩展 asm 指令)以简化编译器的 asm 内联。我更愿意在过程/函数级别引入“naked”指令,它告诉编译器它不必为过程创建堆栈框架,并且可以选择保留哪些寄存器(在 eax、edx 和 ecx 中)。

如果使用 BASM 代码进行高效内联过程的一般任务很困难(并且可能是不必要的),那么一个好主意是为最重要的情况启用内联(例如具有显式声明寄存器使用的裸函数)。

4

2 回答 2

11

请参阅 Quality Central 报告 #9283(并投票赞成)。基本上问题是编译器应该能够理解在内联代码之前要保留哪些寄存器以及之后要恢复什么。只要编译器处理寄存器就很容易,当使用不受控制时,它就不是。您的示例非常简单,但编译器必须能够处理更复杂的情况。报告处于打开状态,希望新的编译器也能够内联 BASM 代码。

于 2010-03-10T08:21:01.313 回答
5

您不能内联手工制作的汇编代码。

允许对这些汇编程序进行内联是非常困难的;正常的内联对寄存器使用、局部变量等有各种影响,编译器不能用内联汇编来做。

于 2010-03-10T07:28:47.670 回答