标签、函数的命名约定

Naming convention for labels, functions

我有点困惑,仍然没有找到明确的答案:我应该将标签命名为 "label1" 还是带下划线“_label1”?什么是最受欢迎和最容易识别的方式?如果我没记错的话,我什至见过一个带有点“.label1”的。

同样的问题函数:"function1"或“_function1”?

从代码可维护性的角度来看,前导点和下划线不会向标签添加任何有用的信息,因此如果没有特定需要这些前缀(见下文),您应该去掉它们。只是您可能认为 "it looks fancy" 并不足以成为使用它们的理由。

汇编器有时使用点来指定标签是 local,即不作为符号导出到目标文件。这对于不使用不需要的符号污染全局名称 space 很有用。

其他汇编程序使用点来表示 汇编程序指令,并且根本不允许在符号中使用点。

下划线通常用于必须与高级语言集成的汇编代码。一些 C 编译器在所有导出的符号前加上下划线,为了能够从 C 代码调用,汇编函数需要遵循此规则。

通常,您的汇编程序(and/or 编译器,如果您与编译代码集成)手册应该能够告诉您您的特定汇编程序支持或需要哪些变体。如果手册没有明确告诉您何时以及为什么应该使用此类前缀,那么就不要使用它们 - 汇编程序标签是自我记录代码的一部分(最少也是最重要的)。如果不需要,请不要将其浪费在无意义的前缀上。

对于 Microsoft“C”函数,实际的函数名称将有一个前导下划线。对于 32 位模式汇编,在 .model 指令中包含语言类型:

        .model  flat,c      ;for 32 bit mode only, no underscores needed

这消除了在函数名称中使用下划线的需要。在 64 位模式下,似乎不允许使用 .model 指令,但它似乎默认为 .model flat,c .

附带说明,Visual Studio 2015 及更高版本在 C 源文件中默认为“内联”printf(和其他一些内容)。有一个遗留版本可以从汇编代码中使用。示例包括 lib 语句。

        includelib      msvcrtd
        includelib      oldnames
        includelib      legacy_stdio_definitions        ;for printf