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); }