【发布时间】: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