uniroma1.*_main.c.cognome.nome. Sulle postazioni del laboratorio sarà /home/biar/Desktop/cognome.nome/.cognome.nome.zip (zip -r cognome.nome.zip cognome.nome/).cognome.nome.zip.E1/e1_eq.c equivalente a quella di partenza, ma più semplice da tradurre in assembly. Testatela con il main di prova prima di passare a scrivere la versione .s. E’ inutile tradurre la versione C equivalente se è errata!Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
Tradurre nel file E1/e1.s la seguente funzione C contenuta in E1/e1.c che implementa il classico algoritmo ricerca binaria (o dicotomica) restituento 1 se x appartiene all’array v di n interi int e 0 altrimenti. Usare il file E1/e1_eq.c per sviluppare la versione C equivalente.
#include "e1.h"
int binsearch(int *v, int n, int x) {
int i=0, j=n;
while (i<j) {
int m = (i+j)/2;
if (v[m]==x) return 1;
if (v[m]>x) j=m;
else i=m+1;
}
return 0;
}
Suggerimento: usare lo shift per dividere per 2.
Usare il main di prova nella directory di lavoro E1 compilando con gcc -m32 e1_main.c e1.s -o e1.
Tradurre nel file E2/e2.s la seguente funzione C contenuta in E2/e2.c che, dati due interi, ne calcola il minimi comune multiplo. Usare il file E2/e2_eq.c per sviluppare la versione C equivalente.
#include "e2.h"
int lcm(int x, int y) {
int greater = y;
if (x > y)
greater = x;
while (1) {
if ((greater % x == 0) && (greater % y == 0))
return greater;
greater++;
}
}
Suggerimento: usare le istruzioni CMOVcc e SETcc.
Usare il main di prova nella directory di lavoro E2 compilando con gcc -m32 e2_main.c e2.s -o e2.
Tradurre nel file E3/e3.s la seguente funzione C contenuta in E3/e3.c che, data una stringa C, calcola la frequenza dei caratteri nel testo e restituisce il carattere ASCII più frequente. Usare il file E3/e3_eq.c per sviluppare la versione C equivalente.
#include <string.h>
#include "e3.h"
char charfreq(const char* s) {
unsigned freq[256];
memset(freq, 0, 256*sizeof(unsigned));
while (*s) freq[*s++]++;
unsigned maxi = 0;
unsigned maxf = freq[0];
int i;
for (i=1; i<256; ++i){
if (freq[i]>maxf) {
maxi = i; // A1
maxf = freq[i]; // A2
}
}
return maxi;
}
Suggerimento: usare l’istruzione CMOVcc per fare i due assegnamenti condizionali A1 e A2.
Usare il main di prova nella directory di lavoro E3 compilando con gcc -m32 e3_main.c e3.s -o e3.
Rispondi alle seguenti domande, tenendo conto che una risposta corretta vale 1 punti, mentre una risposta errata vale 0 punti.
Domanda 1. Siano %eax=20 (decimale), %edx=0 (decimale) e %ecx=8 (decimale). Con riguardo alle due istruzioni “idivl %ecx” e “sarl $3, %eax”, quale delle seguenti affermazioni risulta vera:
Domanda 2. Assumendo %eax=0xFF000000, %ecx=1 (decimale) e %edx=10 (decimale), dopo aver eseguito l’istruzione “testl %eax, %eax” quale delle seguenti affermazioni risulta vera:
Domanda 3. Assumendo %eax=10 (decimale), %ecx=7 (decimale) e %edx=2 (decimale), quale delle seguenti affermazioni risulta vera:
Domanda 4. Quale delle seguenti è un’istruzione valida: