组装过程顺序

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启动代码调用它。