【问题标题】:what is the difference between a label and a function in assembly汇编中的标签和函数有什么区别
【发布时间】:2015-10-03 00:31:14
【问题描述】:

一直在通过 AT&T 语法在 youtube 上关注汇编教程。我刚刚了解了使用 .type 指令声明(如果这是正确的术语)一个函数,例如:

.type MyFunction, @function

现在我可以像这样定义我的函数:

MyFunction:
    <code here>

然后在任何时候调用它:

call MyFunction

我知道在本教程之前,我们只是创建了一个附加到某些代码的标签:

MyLabel:
    <code here>

然后可以这样调用:

call MyLabel

所以我的问题是:

使用 .type 声明的函数与仅使用标签声明的“函数”之间究竟有什么区别? 什么时候应该使用一个而不是另一个,或者这有关系吗?

【问题讨论】:

  • 标签通常用于分支目标。函数在目标文件中“导出”,并由链接器解析 - 因此可以从另一个对象调用它。既然您提到 AT&T,我假设您正在 Linux/BSD(或 OSX)上学习 x86[-64]?
  • 是的,我正在 x86_64 linux 上学习
  • AT&T with GNU as (gas) 不是很友好,但是你不需要很多指令来编写简单的函数,你可以参考 gcc 的汇编输出来看看有多简单C 函数翻译。如果您对Intel syntax 更满意,可以考虑使用nasm。还有 ELF ABI 解释了 x86-64 Linux 的调用约定和堆栈帧。
  • 你使用的是 gnu 汇编器还是别的什么?

标签: assembly gnu-assembler att


【解决方案1】:

以下是 binutils 文档对 .type 指令的评价(假设您使用的是 GNU 汇编器):

该指令用于设置符号的类型。

...

对于 ELF 目标,.type 指令的使用方式如下:

.type name , type description

根据Symbol Type 上的文档:

符号的类型属性包含重定位(节)信息、指示符号是外部的任何标志设置,以及(可选)链接器和调试器的其他信息。确切的格式取决于使用的目标代码输出格式。

.type MyFunction, @function 将标签MyFunction(它是一个符号)标记为链接器或调试器的函数。

手动编写纯汇编文件时,这是不必要的。这是file 的示例,其中调用了itoa 函数。如您所见,标签之前没有指令。

总的来说,标签可以标记为函数,但对于执行代码,它只是一个跳转目标。

【讨论】:

    【解决方案2】:

    我认为您使用的任何程序集都是返回命令。使用汇编程序中“返回”的任何名称。调用函数与分支的不同之处在于,一些上下文数据(具有 N、C、V 位的状态寄存器、程序计数器)被推入/存储到堆栈中。当执行返回命令时,从堆栈中恢复数据。它是在函数调用后保持程序执行的能力所必需的。

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 2016-05-17
      • 1970-01-01
      • 2011-08-13
      • 2018-06-23
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      相关资源
      最近更新 更多