一直在通过AT& T语法在youtube上关注汇编教程。我刚刚学会了使用.type指令声明(如果这是正确的术语)函数,例如:
.type MyFunction, @function
现在我可以定义我的功能:
MyFunction:
<code here>
随后随时打电话:
call MyFunction
我知道在上面的教程中,我们只是创建一个附加到某些代码的标签:
MyLabel:
<code here>
然后可以这样调用:
call MyLabel
所以我的问题是:
用.type声明的函数和简单地用标签声明的'function'之间究竟有什么区别? 应该何时使用另一个,还是重要?
答案 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位的状态寄存器,程序计数器)被压入/存储到堆栈中这一事实与调用不同。执行返回命令后,将还原堆栈中的数据。要使您能够在函数调用后立即从该地址保留程序执行,就需要它。