Viimeisissä harjoituksissa yhdistelemme C:tä ja assemblyä sekä luemme ohjelmalle annettuja käynnistysparametreja.
;TIEA325
;Jani Kurhinen
;23.4.2008
;
;C-kielisessä ohjelmassa ohjelman käynnistysparametrit voidaan lukea
;argc ja argv-muuttujista. Assemblyssä ne löytyvät pinosta kuten muutkin
;parametrit. HUOM: argv[] on merkkijono. Jos halutaan numeerinen
;parametri, on syytä käyttää vakiokirjaston atoi-funktiota.
;
;Alla oleva koodi tarkastaa parametrien määrän ja muuntaa toiselle
;parametrille numeerisen arvon merkkijonosta.
;Huom: kantaosoittimen offset riippuu siitä, mitä olet tallentanut
;pinoon ohjeman käynnistyessä. Esimerkissä sinne on tallennettu kolme
;arvoa.
;
mov eax,[ebp+16] ;argc akkuun
cmp eax,2 ;argc == 2 ??
jne _HELP ;virheellinen määrä parametrejä
mov ebx,[ebp+20];argv[0]rekisteriin
push dword [ebx+4];argv[1] pinoon
call atoi
add esp,4
mov [ebp],eax;paluuarvo paikalliseen muuttujaan
Tee alla olevan kaltainen C-ohjelma sekä yllä olevaa esimerkkikoodia hyödyntävä assembly-rutiini, joka kutsuu fibonaccia käyttäjän antamalla arvolla.
//TIEA325
//Jani Kurhinen
//23.4.2008
//fibonacci.c
//
//käännä aliohjelma komennolla gcc -m32 -c fibonacci.c
//
int fibonacci(int i)
{
if (i==1 || i==2)
return 1
return finonacci(i-1) + fibonacci(i-2);
}