ASM2BCPP.TXT

===============================================================================
     Date: 08-14-95    Time: 08:31p     Number: 1949   
     From: Harald Landro                 Refer: 1943    
       To: Bjørn Stærk                Board ID: INFOLINK        Reply: 
  Subject: ASM vs BC++                      32: Programming/   Status: Public 
-------------------------------------------------------------------------------
BS>OK, men hvis jeg da skal bruke disse rutinene i ett C-program,
  >hva gjør jeg da?

Da må du bare skrive ASM-funksjonen i TASM. Funksjonen skal ha akkurat 
samme navn som den har i C-programmet ditt, med ett unntak: det skal 
ha en underscore (_) foran (streken heter underscore på engelsk, jeg 
vet ikke hva den heter på norsk). Hvis du vil kalle på en C-rutine, så 
setter du (som du sikkert vet) argumentene på stack'en i omvendt 
rekkefølge, og call'er rutinen med underscore (_) foran. Ellers må du 
hele tiden huske på at C setter argumentene på stack'en i *omvendt* 
rekkefølge, og dermed får du argumentene i *riktig* rekkefølge når de 
når rutinen din. Hvis du vil returnere noe, skal returen stå i AX hvis 
det er WORD (int eller near *), eller DX:AX hvis det er DWORD (long 
eller far *). Håper du forstår, jeg er ikke så flink til å forklare... 
Her er i allefall et lite eksempel:
 
/* I asmprove.c */

extern int _AsmRutine( int );

void SkrivTall( int a, int b )
{
  printf( "%d %d", a, b );
} 

void Main( void )
{
  printf( "AsmProve returnerer: %d", _AsmRutine( 4 ) );
}

/* Slutt asmprove.c */

;Start asmprove.asm 

PROC NEAR _AsmProve
        push    bp
        mov     bp, sp          ; Sett opp standard stack frame
        mov     ax, 3           
        push    ax              ; *Andre* argument
        mov     ax, 7          
        push    ax              ; *Første* argument
        call    _SkrivTall      ; Kall på SkrivTall
        add     sp, 4           ; I C har rutinen som kaller ansvaret
                                ; for å rydde opp i stacken etter
                                ; funksjons-tall
        mov     ax, [bp+2]      ; AsmProve returnerer første argument
                                ; (som ligger ved BP+2 (tror jeg...))
        pop     bp              ; Rydd opp og
        ret                     ; Returner...
ENDP
 
;Slutt på asmprove.asm

Det er noe mer du må gjøre, som å deklarere _SkrivTall i asmprove.asm. 
Jeg er ganske sikker på at dette virker (så snart de syntaktiske 
feilene er borte... ;-)), men jeg har ikke testet det... Spør meg hvis 
det er noe du ikke forstår, så skal jeg *prøve* å forklare det ;-)

Harald Landro
---
 ■ 1st 1.11 #3164 ■ Bedre med en pc på pulten enn ti i butikken
===============================================================================