2017-04-11 7 views
0

J'ai une instruction de 32 bits que je souhaite diviser en quatre octets. Disons que l'instruction ressemble à ceci:divisez l'instruction de 32 bits en octets et déplacez le résultat vers une autre adresse en utilisant c

yyyyyzzzzzzxxxxxx????????? 

L'instruction est un mot qui se compose de quatre ints non signés. y représente le code d'opération, et ??? sont pour l'espace inutilisé. Je travaille sur une machine big-endian. Ce que je voudrais arriver est de déplacer les valeurs de z + w à a.

Je n'ai jamais travaillé dans C avant, mais je l'ai essayé de le faire comme ça.

Voici comment je lis le mot, juste pour que je ca imprimer sur chaque octet:

unsigned int a, b, c, o; 
w = instruction << 24; 
z = instruction << 16; 
x = instruction << 8; 
y = instruction; 

Ici imprimer des valeurs non signées, juste pour vérifier ce que le résultat sont.

printf("%u\n", w); 
printf("%u\n", z); 
printf("%u\n", x); 
printf("%u\n", y); 
printf("\n"); 

regs[x] = instruction + instruction << 8; 

si j'imprimer les valeurs de regs[x] après cela, je peux voir que j'a une valeur maintenant, mais est-ce la bonne façon de le faire? Quand je fais ceci, dois-je régler le registre = z + w?

EDIT Mabye je devrais obtenir les bits comme celui-ci?

  y = (inst >> 24) & 077; 
      x = (inst >> 16) & 0xffff; 
      z = (inst >> 8) & 0xffff; 
      w = (inst) & 0xffff; 

puis faites comme ceci:

regs[y] = z + w; 
+0

S'il vous plaît noter qu'un « octet » est généralement considéré comme 8 bits, 32 bits divisant alors en quatre octets et encore obtenir trois bits inutilisés est un peu difficile. Aussi, lors de l'illustration d'un mot comme celui-ci, chaque lettre devrait typiquement représenter un bit. Mais vous ne montrez que 23 lettres (y compris les '?' S à la fin), ce qui rend difficile à interpréter. – unwind

+0

@unwind désolé, oui je devrais l'avoir écrit comme ça yyyyyzzzzzzxxxxxx ????????? peut-être que j'ai mal compris ce que je devais faire, j'ai fait un montage à la question – user123

Répondre

0

Si vous utilisez uniquement des positions de bits et compte vous pouvez construire un masque de bits soit 9 bits avec réglage du bit suivant et décrément (1 < < 10) -1. Donc, vos valeurs sont

#define MASK(n) ((1<<(n+1))-1) 

unsigned int w = instruction & MASK(9); 
unsigned int x = (instruction >> 9) & MASK(6); 
unsigned int z = (instruction >> 15) & MASK(6); 
unsigned int y = (instruction >> 21) & MASK(5); 

toutes les valeurs sont décalées vers le bas. Donc, si vous voulez combiner z et w vous devrez

unsigned int zw = z<<9 | w; 

car w contient 9 bits, ou

unsigned int wz = w<<6 | z; 

car z contient 6 bits.

+0

cela ressemble à la façon dont je voulais le faire, pouvez-vous expliquer ce que fait la définition de MASQUE? Est-ce que ça s'étend avec des zéros? si cette question a un sens, – user123

+0

MASK (9) génère une valeur de 32 bits de '0b0000000000000000000011111111111'. Si vous utilisez ce masque dans une opération '&', vous obtenez la valeur de tous les bits qui sont dans le masque à 1. – Holger

+0

cela a du sens! donc, si je voulais étendre à 16 bits je pourrais mettre MASK (6), merci pour l'aide – user123