标签和装配中的功能有什么区别

时间:2015-07-14 11:35:34

标签: assembly gas att

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

.type MyFunction, @function

现在我可以定义我的功能:

MyFunction:
    <code here>

随后随时打电话:

call MyFunction

我知道在上面的教程中,我们只是创建一个附加到某些代码的标签:

MyLabel:
    <code here>

然后可以这样调用:

call MyLabel

所以我的问题是:

用.type声明的函数和简单地用标签声明的'function'之间究竟有什么区别? 应该何时使用另一个,还是重要?

2 个答案:

答案 0 :(得分:2)

这是binutils文档关于.type指令的内容(假设您使用的是GNU汇编器):

  

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

     

...

     

对于ELF目标,.type指令的用法如下:

     

.type name , type description

根据Symbol Type上的文档:

  

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

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

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

总而言之,标签可以标记为函数,但是对于执行代码而言,它只是两种方式的跳转目标。

答案 1 :(得分:-1)

我认为您使用的任何装配体都是return命令。汇编程序中将使用“ return”的任何名称。调用函数与分支的区别在于某些上下文数据(具有N,C,V位的状态寄存器,程序计数器)被压入/存储到堆栈中这一事实与调用不同。执行返回命令后,将还原堆栈中的数据。要使您能够在函数调用后立即从该地址保留程序执行,就需要它。

相关问题