11.8 Return values

  -------------------

 

      Values returned from functions are found in registers.  The following

  table shows which register is used for each returned type.

 

      -----------------------------

      |returned type|register used|

      -----------------------------

      |    byte     |     AL      |

      |    word     |     AX      |

      |    dword    |     EAX     |

      |    char     |     AL      |

      |    int      |     AX      |

      |    long     |     EAX     |

      |    float    |     EAX     |

      -----------------------------

 

      The simplest way of returning values from functions is to use the

  command return() but one can also directly load the returned value into the

  appropriate register. For example, the following two functions return the

  same value:

 

           byte proc_one ()

           {

           return (42);

           }

 

           byte proc_two ()

           {

           AL = 42;

           }

 

      Many DOS 0x21 interrupt functions use as an index of successful

  execution the setting or unsetting of the 'carry' flag. It is possible to

  use processor flags when returning from functions in other situation where

  you need to have the status of a successful or unsuccessful execution of a

  function. This makes it possible to make better use of the abilities of the

  processor and thus to reduce code size and increase program speed.

 

      In addition to flags, when returning from functions you can still

  return various types via registers AL/AX/EAX.  If a function was declared

  to be of return type 'int' and 'CARRYFLAG', when it is used in 'IF' and

  'WHILE' type comparison functions the 'carry' flag will be checked and

  register AX will not be compared.  Here is an example of using return of

  flags from functions:

 

  int CARRYFLAG FOPEN();      // declaration of a function

 

  void proc()

  {

    IF ( FOPEN(name,0) ) Error ( "File not open" );

  }

 

      Examples of syntax permitted for using a flag as returned value:

 

  IF ( ! FOPEN() )...

  IF ( @ FOPEN() )...

  IF ( ! @ FOPEN() )...

  IF ( handl = FOPEN() )...

  IF ( handl = @ FOPEN() )...

  IF ( ! handl = FOPEN() )...

  IF ( ! handl = @ FOPEN() )...

 

      Here are some examples in which, even though a flag used as a return

  value has been declared for a function, there is comparison of register AX:

 

  IF ( FOPEN() == 5 )...      // comparison performed

 

  IF ( FOPEN() + 2 )...   // the result of the function undergoes further

                          // calculation, resulting in a change to the flags