2009-10-22 3 views
1

Ainsi, par exemple, ce serait quelque chose comme ceci:Comment lw est-il représenté en C ou C++?

pv $ t1, 0 ​​(t0 $)

ou

pv t2 $, 8 (t0 $)

Traduire en C ou C++? Je veux dire que je charge un mot de l'adresse dans un registre, je comprends. Un tableau est-il un concept similaire, ou quoi?

Merci d'avance.

Répondre

2

Il s'agit d'une instruction de "mot de chargement". Il charge un mot de 4 octets de la mémoire à l'emplacement dont l'adresse est stockée dans le registre $ t0, dans le registre $ t1.

Il n'y a pas de construction équivalente en c/C++. Cette instruction est très populaire et utilisé dans la plupart des constructions où l'accès mémoire nécessaire, par exemple:

int *p; 
// p = ... 
*p += 10; 

peut se traduire par quelque chose comme (T0 $ contient pointeur « p »)

lw $t1, 0($t0) 
addi $t1, $t1, 10 
sw $t1, 0($t0) 

ici la première instruction charge la variable dans un registre, le second modifie et le troisième écrit à nouveau dans la mémoire

0

Pour la première ligne:

int t1, *t0; ... t1 = *t0 ou t1 = t0[0] ou même int t0, t1; ... t1 = t0.

Pour la seconde:

int t2 = t0[2], peut-être, ou peut-être int t2 = t0.thirdThing.

struct { 
    int a,b,thirdThing; 
} t0; 

Mais vous ne pouvez pas le savoir avec certitude. Il pourrait être char *x, **y; x = y[2]; Si nous avons vu comment l'adresse est entré dans le registre, il pourrait apporter plus de lumière sur le code original.

0

Je pense que vous ne pouvez pas écrire exactement le même code. Vous pouvez effectuer les opérations suivantes:

int* wordAddress = ... + 8; // 8 or any offest 
// assuming int is a word on MIPS wich I never worked with personally 
int word = *wordAddress; 

Vous pouvez appliquer le décalage lors de la récupération de la valeur aussi:

int* wordAddress = ... + 0; 
int word = *(wordAddress + 8); 

Il y a une note: Vous ne pouvez pas spécifier le register requis dans la langue. Ce que vous pouvez faire est de donner une indication au compilateur de mettre word dans un register:

// it is just a hint. The compiler is free to put it in memory. 
register int word = *wordAddress; 
0

En supposant que vous utilisez MIPS32 (et ont donc la mémoire 32 bits d'adressage) puis son assez facile ce qu'ils font. Cela permet de charger la valeur au décalage d'octet 0 de l'adresse mémoire t0 dans le registre t1.Cela permet de charger la valeur au décalage d'octet 8 de l'adresse mémoire t0 dans le registre t2.

Supposons que vous avez une adresse de mémoire 0x12345678. Ensuite, l'assemblage MIPS effectue essentiellement les opérations suivantes:

int t0 = 0x12345678; 
// ... 
int t1 = *(int*)(t0 + 0); 
int t2 = *(int*)(t0 + 8); 
Questions connexes