组装过程顺序
Order of procedures in assembly
asm 程序在源文件中的顺序应该是什么:从内到外还是相反?主要代码(不在 proc 内)应该去哪里:靠近文件的开头或结尾?是否有 objective 标准可供选择,而不仅仅是惯例?
没有约定;通常将相关功能放在源代码中彼此靠近。 基本上与使用 C 或任何其他语言相同。就可读性而言,asm 没有什么特别之处可以覆盖它,除了 asm 函数通常不是很短(因为没有什么是将为您内联它们,并且您不希望到处都是实际的 call/ret 开销。
如果您牺牲性能来获得 "small functions" 可读性,那么 asm 是错误的语言;如果你的项目那么大,让编译器来做。使代码块成为可调用函数而不是宏应该受到 I-cache 占用空间及其使用频率的激励。
或者为了性能,将 "hot" 函数分组到同一个 iTLB 页面中,对于小函数甚至在同一个 L1 指令缓存行中,或者在一个函数的结尾和下一个函数的开头之间的边界处。例如将相互调用或经常紧接着调用的函数组合在一起。
如果您希望源顺序与二进制顺序不同,您可以将 "cold" 函数(在启动或关闭时调用一次)放在 .text.startup
这样的部分而不是通常的 .text
部分;例如,GCC 为 main
执行此操作而不是通常的 .text
指令
.section .text.startup,"ax",@progbits
.globl main
main:
...
.text # shorthand for .section .text
other_function:
("ax",@progbits
对于 ELF 目标意味着 exec 权限,并且该部分应该映射到进程内存中,而不是仅仅坐在磁盘上的可执行文件中而不被程序加载器映射。或者更具体地说,链接到具有这些属性的 ELF 段)。
如果你好奇,试试看on Godbolt。
here should the main code (which is not within proc) go
嗯?通常您会在入口点上放置一个标签,即使它本身并不是 "function"。通常你只写一个main
(这是一个函数),让CRT启动代码调用它。
asm 程序在源文件中的顺序应该是什么:从内到外还是相反?主要代码(不在 proc 内)应该去哪里:靠近文件的开头或结尾?是否有 objective 标准可供选择,而不仅仅是惯例?
没有约定;通常将相关功能放在源代码中彼此靠近。 基本上与使用 C 或任何其他语言相同。就可读性而言,asm 没有什么特别之处可以覆盖它,除了 asm 函数通常不是很短(因为没有什么是将为您内联它们,并且您不希望到处都是实际的 call/ret 开销。
如果您牺牲性能来获得 "small functions" 可读性,那么 asm 是错误的语言;如果你的项目那么大,让编译器来做。使代码块成为可调用函数而不是宏应该受到 I-cache 占用空间及其使用频率的激励。
或者为了性能,将 "hot" 函数分组到同一个 iTLB 页面中,对于小函数甚至在同一个 L1 指令缓存行中,或者在一个函数的结尾和下一个函数的开头之间的边界处。例如将相互调用或经常紧接着调用的函数组合在一起。
如果您希望源顺序与二进制顺序不同,您可以将 "cold" 函数(在启动或关闭时调用一次)放在 .text.startup
这样的部分而不是通常的 .text
部分;例如,GCC 为 main
执行此操作而不是通常的 .text
指令
.section .text.startup,"ax",@progbits
.globl main
main:
...
.text # shorthand for .section .text
other_function:
("ax",@progbits
对于 ELF 目标意味着 exec 权限,并且该部分应该映射到进程内存中,而不是仅仅坐在磁盘上的可执行文件中而不被程序加载器映射。或者更具体地说,链接到具有这些属性的 ELF 段)。
如果你好奇,试试看on Godbolt。
here should the main code (which is not within proc) go
嗯?通常您会在入口点上放置一个标签,即使它本身并不是 "function"。通常你只写一个main
(这是一个函数),让CRT启动代码调用它。