首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Delphi编译器没有内联汇编函数?

为什么Delphi编译器没有内联汇编函数?
EN

Stack Overflow用户
提问于 2010-03-10 06:33:39
回答 2查看 2.2K关注 0票数 7

有时,我编写非常短的汇编函数,例如

代码语言:javascript
复制
function SeniorBit(Value: LongWord): Integer;
asm
        OR    EAX,EAX
        JZ    @@Done
        BSR   EAX,EAX
        INC   EAX
@@Done:
end;

这似乎是最好的内衬人选:

代码语言:javascript
复制
function SeniorBit(Value: LongWord): Integer; inline;

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

更新:

多亏了ldsandon,有了5.5年历史的开放QC报告。该报告包含一些建议(比如扩展asm指令),以简化编译器的asm内联。我倾向于在过程/函数级别上引入“裸”指令,该指令向编译器说明它不必为过程创建堆栈框架,还可以选择保留哪些寄存器( eax、edx和ecx)。

如果使用BASM代码高效内联过程的一般任务是困难的(而且可能是不必要的),那么一个好主意是为最重要的情况启用内联(比如使用明确声明的寄存器用法的裸函数)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-10 08:21:01

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

票数 11
EN

Stack Overflow用户

发布于 2010-03-10 07:28:47

无法内联手工编制的程序集代码。

很难允许这些汇编程序段的内联;正常情况下,内联对寄存器使用、局部变量等有各种各样的影响,编译器无法使用内联程序集。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2414964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档