--*- coding: utf-8; -*-- INF2270 Oppgaver uke 7 (14.-18.2.2011) (Oppgave 1 og 3 er viktigst.) Oppgave 1 Oversett funksjonen int f2 (int a, int b) { return (-a) + (-b); } til x86-assemblerkode ved å bruke kun disse instruksjonene: movl, addl, subl, incl, decl og ret. Hint: Er det mulig å forenkle uttrykket? Oppgave 2 Skriv en makro #define STREQ(s1,s2) som sjekker om de to tekstene er like. Tanken er at den kan brukes i if-tester: if (STREQ(s,"Abc")) ... Hint: Hvordan sammenligner man to tekster i C? Oppgave 3 På forelesningen ble det vist en MIN-makro med mange parenteser: #define MIN(x,y) ((x)<(y) ? (x) : (y)) Hvorfor er ikke definisjonen kun #define MIN(x,y) x int main(int argc, char *argv[]) { int ix; for (ix = 1; ix < argc; ix++) { printf("%s", argv[ix]); if (ix < argc-1) printf(" "); } printf("\n"); } Da vil følgende skje når vi bruker programmet 'wc': % wc echo.c 12 30 186 echo.c Filen har altså 12 linjer, 30 ord og 186 tegn. En linje er definert som «tekst avsluttet med '\n'» mens ord er definert som «sekvens av ikke-blanke tegn». Hint. Hvis man henter inn definisjonsfilen ctype.h ved å skrive #include får man funksjonen 'isspace(c)' som kan brukes til å teste om 'c' er et blankt tegn eller ikke. Blanke tegn omfatter vanlig mellomrom (' '), linjeskift ('\n'), tabulator ('\t') og andre. Skriv programmet 'wc' slik at det leser filen angitt som parameter og skriver ut hvor mange linjer, ord og tegn det er der.