2010-05-24 4 views
0

J'essaye juste de bidouiller autour de ce qui est le meilleur et le plus court chemin pour décrire deux instructions simples avec le pseudo code C-like. L'instruction extrait est défini comme suit:Pseudo code pour la description de l'instruction

extract rd, rs, imm 

Cette instruction extrait l'octet approprié dans le registre de source 32 bits rs et justifie droite dans le registre de destination. L'octet est spécifié par imm et donc peut prendre les valeurs 0 (pour l'octet le moins significatif) et 3 (pour l'octet le plus significatif).

rd = 0x0; // zero-extend result, ie to make sure bits 31 to 8 are set to zero in the result 
rd = (rs && (0xff << imm)) >> imm; // this extracts the approriate byte and stores it in rd 

L'instruction d'insertion peut être considérée comme l'opération inverse et il faut un octet justifié à droite sur l'endroit du registre de source et le dépose dans l'octet approprié du registre destination rd; encore une fois, cet octet est déterminé par la valeur de imm

tmp = 0x0 XOR (rs << imm)) // shift the byte to the appropriate byte determined by imm 
rd = (rd && (0x00 << imm)) // set appropriate byte to zero in rd 
rd = rd XOR tmp   // XOR the byte into the destination register 

Cela ressemble tous un peu horrible, donc je me demande s'il y a un peu une façon plus élégante de décrire ce bahaviour dans le style C comme;)

Un grand merci, Claus

+2

Désolé, mais « pseudo-code C-like » est un oxymore. Toute la raison du pseudo-code est de faire abstraction de l'ordinateur en utilisant la prose et/ou la notation mathématique pour décrire les opérations au lieu de la syntaxe formelle. –

Répondre

5

Extrait:

rd = (rs >> (imm * 8)) & 0xff 

Insérer:

rd = (rd & ~(0xff << (imm * 8))) | ((rs & 0xff) << (imm * 8)) 
+0

Merci, je ne sais pas pourquoi je rends la vie plus difficile qu'elle ne l'est: P – Claus

+0

Je pense que le premier «rs» dans la ligne d'insertion devrait être «rd». –

+0

Merci, @Mike. –

0

D'abord, je pense que vous voulez dire '&' (opérateur de bits) au lieu de '& &' (logique). L'opérateur XOR en C '^'

rd = 0x0; 
rd = (rs & (0xff << imm)) >> imm; 

tmp = 0x0^(rs << imm)); 
rd = (rd & (0x00 << imm)); 
rd = rd^tmp; 

En second lieu, il est plus simple de faire quelque chose comme:

rd = (rs >> (imm * 8)) & 0xFF; 

et pour la deuxième partie:

rd = (~(0xFF << (imm * 8)) & rd) | ((rs & 0xFF) << (imm * 8)); 

La première partie créer un masque avec '1' bits partout mais dans l'octet intéressant l'AND (&) mettre cet octet à '0' et ensuite vous ajoutez votre octet rs. Ce n'est pas optimisé mais vous voyez le point.

Edit: Je vois juste Matthew répondre. J'ai mal lu, imm est dans les octets pas bits, alors qu'il souligne un * 8 est nécessaire. J'ai corrigé la formule. Il est juste trop pour masquer rd avec 0xFF pour être sûr que rs octets les plus significatifs ne sont pas pris en compte ...

MY2C

Questions connexes