stocker une valeur d'un entier non signé (long de 2 octets) à une variable char non signée à l'aide d'opérateurs au niveau du bit?
-
06-07-2019 - |
Question
Comment mettre la valeur de 0x04 dans le registre 4 si le instruction était 1rxy? 1RXY-charge le registre R avec la valeur à l'adresse mémoire XY
#include <stdio.h>
unsigned char r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,ra,rb,rc,rd,re,rf;
void reg_check(unsigned char reg);
void rxy1(unsigned char reg, unsigned char val);
int main(){
unsigned char memloc1=0x14;
unisgned char memloc2=0x04;
unsigned char temp,reg,val_add;
temp=(x && 0xFF00) >> 8;
if (temp = 0xB){
reg=(memloc1 &0x0F);
val_add=memloc2;
rxy1(reg,val_add);
}
return 0;
}
void reg_check(unsigned char reg){
}
void rxy1(unsigned char reg, unsigned char val){
L'instruction réelle est 0x1404, cette division en deux octets, memloc1 et memloc2. Selon le format de 1rxy, ce qui signifie mettre la valeur "at" emplacement mémoire xy dans le registre r.
alors ici, le registre 4 ou le caractère non signé r4
devrait contenir la valeur à l'emplacement de mémoire 0x04, qui contiendrait un autre numéro.
Ma question est de savoir comment tester la variable de registre en déterminant le "r". ou 1 "r" xy in 1 "4" 04 et en plaçant la valeur conservée à l'emplacement xy dans la variable de char non signée r4
par exemple si l'emplacement de mémoire 0x04
est maintenu 0xFB
.
J'espère que cela a du sens.
[modifier] Exemple
#include <stdio.h>
int main(){
unsigned char r0,r2,r3,r4;
unsigned char mem1=0x14; //at lmemory address 00
unsigned char mem2=0x04; //at lmemory address 01
unsigned char reg_val_store=mem1 & 0x0F;
if( ((mem1= & 0xF0) >> 4) == 0x1){
if (reg_val_store == 0x4){
//then put value store at memory address "04" into register 4.
//and just say for example "0xFD" was at memory location "04"
//since register value is 4 from the instruction read in 0x1"4"04
//i want to put 0xFD in the r4 unsigned char variable, how do i do this?
r4=0xFD; // this is of course correct but the instruction read in changes and
// so does the register variable. how do i modify my code for this change?
}
}
return 0;
}
La solution
Si je comprends bien, vous voulez mettre B4 en mémoire [0] et 04 en mémoire [1]. Ai-je raison?
Cela le fera.
memory[0] = ((x & 0xFF00) >> 8 ); //Will put B4 in memory[0]
memory[1] = (x & 0xFF); //Will put 04 in memory[1]
Je pense que vous souhaitez ensuite vérifier B et 4 séparément dans la mémoire [0], puis passer à l'étape suivante. Droit?
(memory[0] & 0xF0) >> 4 // will give you 0xB
(memory[0] & 0x0F) //will give you 0x4
Est-ce ce que vous cherchez?
Mettre à jour : pour votre problème de lecture, utilisez-le.
while (!feof(f))
{
fscanf(f,"%X",&inst[i]);
i++;
}
Ceci lit jusqu’à EOF et vous pouvez utiliser la valeur i après cette boucle pour savoir combien d’instructions sont lues et le mettre dans une variable, par exemple n_instr. Et puis pour les instructions en boucle, vous pouvez utiliser cette
while(loop<n_instr) //instead of just loop<80
{
memory[j] = ((inst[loop] & 0xFF00) >> 8 );
j=j+2;
memory[k] = (inst[loop] & 0x00FF);
k=k+2;
loop++;
}