Si traduca in Assembly IA32 la seguente funzione C, scrivendo un modulo clear.s:
void clear(char* v, unsigned n) { // v è un array, n è la lunghezza dell'array
unsigned i=0;
while (i<n) v[i++]=0;
Si suggerisce di riscrivere dapprima il programma in una forma C equivalente in cui il while viene rimpiazzato da un if (…) goto.
Si traduca in Assembly IA32 la seguente funzione C, scrivendo un modulo clear2.s:
void clear2(char* v, unsigned n) { // v è un array, n è la lunghezza dell'array
char* p=v+n;
while (v<p) *v++=0;
}
Si suggerisce di riscrivere dapprima il programma in una forma C equivalente in cui il while viene rimpiazzato da un if (…) goto.
Si traduca in IA32 la seguente funzione che fonde un array ordinato a
di size na
con un altro array ordinato b
di size nb
scrivendo il risultato della fusione nell’array c
di size almeno (na+nb
).
e3.c
void merge(const int* a, const int* b, int* c, int na, int nb) {
int i=0, j=0, k=0;
while(i<na && j<nb)
if (a[i]<=b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
while(i<na) c[k++] = a[i++];
while(j<nb) c[k++] = b[j++];
}
Tradurre la seguente functione C in IA:
#include "e4.h"
void array_div(const int *a, const int *b, div_rem_t *res, int n){
int i = 0;
for (i=0; i<n; ++i) {
int min = a[i] < b[i] ? a[i] : b[i];
int max = a[i] >= b[i] ? a[i] : b[i];
res[i].quot = max / min;
res[i].rem = max & min;
}
}