有时,我编写非常短的汇编函数,例如
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内联。我倾向于在过程/函数级别上引入“裸”指令,该指令向编译器说明它不必为过程创建堆栈框架,还可以选择保留哪些寄存器( eax、edx和ecx)。
如果使用BASM代码高效内联过程的一般任务是困难的(而且可能是不必要的),那么一个好主意是为最重要的情况启用内联(比如使用明确声明的寄存器用法的裸函数)。
发布于 2010-03-10 08:21:01
参见质量中心报告#9283 (并投票赞成)。基本上,问题在于编译器应该能够理解在内联代码之前要保存哪些寄存器,以及之后要恢复哪些寄存器。只要编译器处理寄存器是容易的,当使用不在is控制之下时,就不是。您的示例非常简单,但是编译器必须能够处理更复杂的情况。该报告处于开放状态,希望新编译器也能内联BASM代码。
发布于 2010-03-10 07:28:47
无法内联手工编制的程序集代码。
很难允许这些汇编程序段的内联;正常情况下,内联对寄存器使用、局部变量等有各种各样的影响,编译器无法使用内联程序集。
https://stackoverflow.com/questions/2414964
复制相似问题