Toon posts:

[C & ASM] het nut van _stdcall

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel ik heb een code fragment:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int _stdcall fac1(int n)
{
  int f = 1, k;
  for(k=1; k<=n; k++)
    f *= k;
  return f;
}

int fac2(int n)
{
  if(n > 1)
    return n * fac2(n-1);
  else
    return 1;
}

void main(void)
{
  int n;
  printf("n = ");
  scanf("%d", &n);
  printf("fac1 n = %d\n", fac1(n));
  printf("fac2 n = %d\n", fac2(n));
}

Nu gebruik ik dus _stdcall voor de aanroep van de functie fac1, zodat ik de windows conventie wordt gebruikt. Echter, wat heeft het eigenlijk voor effect om hier _stdcall voor te zetten. Je zou natuurlijk ook de C conventie kunnen gebruiken. Volgens mij heeft het iets met de stack te maken. ;)

Ik vroeg mij dit af nadat ik (delen van) dit fragment in asm gezien heb. Ik hoop dat iemand mij duidelijkheid kan verschaffen over het nut en/of effect van _stdcall op ASM niveau. :)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:19
Google rules:

http://www.codeproject.co...nventions_demystified.asp

En voor meer info, kun je zelf zoeken op calling conventions (in combinatie met explanation o.i.d.).

Het heeft inderdaad te maken met het verdelen van verantwoordelijkheden (voor het opruimen van de stack en het plaatsen van parameters en resultaten) over de caller en de functie die aangeroepen wordt.

Verwijderd

Topicstarter
Vervolg vraag:

De lokale vars in fac1 worden niet in een stackframe geplaatst. Waarom zou de compiler dit doen. Persoonlijk vind ik het makkelijker rekenen, maar heeft iemand mssn nog een andere optie waarom dit gebeurt.

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-07 16:33
Verwijderd schreef op 13 november 2002 @ 10:34:
De lokale vars in fac1 worden niet in een stackframe geplaatst. Waarom zou de compiler dit doen. Persoonlijk vind ik het makkelijker rekenen, maar heeft iemand mssn nog een andere optie waarom dit gebeurt.
Omdat de code veel sneller is als de variabelen in registers worden gehouden. Als je in debug mode compileert zullen ze waarschijnlijk wel op de stack worden gezet (dit hangt natuurlijk af van je compiler).