Bootstrap

汇编学习——使用函数

一、定义函数

   当应用程序需要相同代码时,不必多次重新编写代码,有时候最好创建包含代码的单一函数

(function),然后可以在程序中的任何位置调用这个函数。函数包含完成特定例程所需的所有代

码,而且不需要主程序中任何代码的帮助。数据从主程序传递给函数,然后结果返回给主程序。

    调用函数时,程序的执行路径被改变、切换到函数代码中的第一条指令。处理器从这个位置开

始执行指令,直到函数表明它可以把控制返回到主程序中的原始位置。如下图所示:

      大多数高级语言提供了在程序中编写和使用函数的方法。函数可以和主程序包含在相同的源

代码文件中,并且一起编译,函数也可以位于独立的源代码文件中,并且连接到主程序。   

      下面是一个计算给定半径的圆的面积的简单C语言函数:

#include <stdio.h>

float function1( int radius )
{
  float result = radius * radius * 3.14159;
  return result;
}

int main()
{
  int i;
  float result;
  i = 10;
  result = function1( i );
  printf( "Radius: %d, Area: %f\n", i, result );
  i = 2;
  result = function1( i );
  printf( "Radius: %d, Area: %f\n", i, result );

  i = 120;
  result = function1( i );
  printf( "Radius: %d, Area: %f\n", i, result );

  return 0;
}

二、汇编函数

   1、编写函数

    在汇编语言中创建函数需要3个步骤:

  •     定义需要的输入值
  •     定义对输入值执行的操作
  •     定义如何生成输出值以及如何把输出值传递给发出调用的程序

     1)定义输入值

      很多函数都需要某种形式的输入数据。可以使用三种技术:

  • 使用寄存器
  • 使用全局变量
  • 使用堆栈

       当主程序调用函数时,主程序在调用函数时停止,函数从这个位置开始执行,函

数可以访问位于内存中和寄存器中的任何数据。使用寄存器把输入值传递给函数是快

速而且方便的。

       2)定义函数处理

       在源代码文件中,函数指令必须和主程序的其余指令分离开。

       不同的汇编器使用不同的方法定义函数。

       为了在GNU汇编器中定义函数,必须在程序中把函数名称声明为标签。可以使用

.type命令:

.type funcl, @function
func1:

       .type命令通知GNU汇编器,func1标签定义将在汇编语言程序中使用的函数的开

始,func1标签定义函数的开始。func1标签后面的第一条指令是函数的开头。

        函数结束由RET指令定义,执行RET指令时,程序控制返回主程序,返回的位置

是紧跟在调用函数的CALL指令后面的指令。  

       3)定义输出

;