Calling C/C++ Functions (Cont.)


Code Example—Finding all Factors (Cont.)

 factors.asm 
 
 
Title Find all factors (factors.asm)
 
 
; An assembly program calls external C/C++ functions.

 
 
INCLUDE Irvine32.inc

 
 
askForInteger PROTO C
 
 
showInt PROTO C, value:SDWORD, outWidth:DWORD

 
 
OUT_WIDTH = 8

 
 
.data
 
 
      save    DWORD ?
 
 
.code

 
 
;--------------------------------------------------------------
 
 
;  Inputs an integer n and displays all factors of the integer.
 
 
;--------------------------------------------------------------

 
 
DisplayFactors PROC C
 
 
    INVOKE askForInteger                  ; call C++ function
 
 
    mov    save, eax
 
 
    cmp    eax, 0
       
mov ecx, eax L1: mov eax, save ; EAX = input cdq ; dividend = EDX:EAX idiv ecx ; divisor = ECX .IF ( edx == 0 ) ; remainder == 0 push ecx ; save ECX INVOKE showInt, ecx, OUT_WIDTH ; call C++ function call Crlf pop ecx ; restore ECX .ENDIF loop L1 L2: ret DisplayFactors ENDP END
 main.cpp 
 
 
// main.cpp

 
 
// Demonstrates function calls between a C++ program
 
 
// and an external assembly language module.

 
 
#include  <iostream>
 
 
#include  <iomanip>
 
 
using namespace  std;


 
 
extern "C" {
 
 
  // external ASM procedures:
 
 
  void  DisplayFactors( );

 
 
  // local C++ functions:
 
 
  int   askForInteger( );
 
 
  void  showInt( int value, int width );
 
 
}


 
 
// program entry point
 
 
int  main( ) {
 
 
  DisplayFactors( );                    // call ASM procedure
 
 
  return( 0 );
 
 
}


 
 
// Prompt the user for an integer. 
 
 
int  askForInteger( ) {
 
 
  int  n;
 
 
  cout << "Enter a positive integer: ";
 
 
  cin  >> n;
 
 
  return( n );
 
 
}


 
 
// Display a signed integer with a specified width.
 
 
void  showInt( int value, int width ) {
 
 
  cout << setw( width ) << value;
 
 
}


      “I’m not arguing, I’m just explaining why I’m right.”    
      ― Unknown