Écrire en C puis en assembleur DLX la fonctions strcpy; pour simplifier on suppose que dest et src sont dans R1 et R2. Le résultat sera stocké dans R3. char *strcpy(char *dest, const char *src); { for (int i=0; src[i] <> '\0'; i++) dest[i]=src[i]; dest[i]=src[i]; } Hypothèse : i est dans R3; i=0 OR r0,r0 -> r3 r4 = src + i ADD r2,r3 -> r4 r4 = src[i] LB [r4 + 0] -> r4 BEQZ r4, +24 r5 = dest + i ADD r1,r3 -> r5 dest[i]=r4 SW r4 -> [r5 + 0] i++ ADDI r3, 1 -> R3 r4 = src + i ADD r2,r3 -> r4 r4 = src[i] LB [r4 + 0] -> r4 BNEZ r4, -24 r5 = dest + i ADD r1,r3 -> r5 dest[i]=r4 SW r4 -> [r5 + 0] Autre solution : char *strcpy(char *dest, const char *src); { while (*src != '\0) { *dest = *src; dest++; src++; } *dest = *src; } r3 = *src LB [r2 + 0] -> r3 BEQZ r3, +20 *dest=r3 SW r3 -> [r1 + 0] src++ ADDI r2, 1 -> r2 dest++ ADDI r1, 1 -> r1 r3 = *src LB [r2 + 0] -> r3 BNEZ r3, -20 *dest=r3 SW r3 -> [r1 + 0] Traduire en assembleur le programme suivant (les int sont stockés sur 32 bits) les variables A, B et C sont des variables globales : #define N 1000 int A[N], B[N], C[N]; for(int i=0; i r1 r2 = i<1000 SLTI r1,1000 -> r2 BEQZ r2, +32 r2 = 4*i SLLI r1, 2 -> r2 r3 = B[i] LW [r2 + 0xb000] -> r3 r4 = C[i] LW [r2 + 0xc000] -> r4 r3 = B[i]+C[i] ADD r3,r4 -> r3 A[i] = r3 SW r3 -> [r2 + 0xa000] i++ ADDI r1, 1 -> r1 r2 = i<1000 SLTI r1,1000 -> r2 BEQZ r2, -32