int move_reg(unsigned char *codigo,char *var1,int j,int eax,int line) { if (var1[0] == '$') { int c=Constante(var1); if (eax) codigo[j]= 0xb8; else codigo[j]= 0xb9; *( (int *) &codigo[j+1] ) = c; j+=5; } else { codigo[j]=0x8b; codigo[j+1]=0x45; j+=2; if (var1[0] == 'p' && var1[1] >= '0' && var1[1] < '5') codigo[j] = (var1[1]-'0')*4 +8; else if (var1[0] == 'v' && var1[1] >= '0' && var1[1] < '5') codigo[j] = 252 - (var1[1]-'0')*4; else error("operando invalido", line); j++; } return j; }
/* Faz "op var1, %eax". Retorna j atualizado*/ int op_reg(unsigned char *codigo, char *var1, char op, int j,int line) { if (var1[0] == '$') { int c=Constante(var1); if (op=='+') codigo[j]= 0x05 ; else if (op =='-') codigo[j]= 0x2d; else if (op =='*') codigo[j]= 0x69; else error("operando invalido", line); *( (int *) &codigo[j+1] ) = c; j+=5; } else { if (op == '+') { codigo[j]=0x03; codigo[j+1]=0x45; j+=2; } else if (op =='-') { codigo[j]=0x2b; codigo[j+1]=0x45; j+=2; } if (op=='*') { codigo[j]=0x0f; codigo[j+1]=0xaf; codigo[j+2]=0x45; j+=3; } if (var1[0] == 'p' && var1[1] >= '0' && var1[1] < '5') codigo[j] = (var1[1]-'0')*4 +8; else if (var1[0] == 'v' && var1[1] >= '0' && var1[1] < '5') codigo[j] = 252 - (var1[1]-'0')*4; else error("operando invalido", line); j++; } return j; }
/* ------------------------------------------------------------------------- Função: Go ------------------------------------------------------------------------- @short : Calcula o histograma de níveis de cinza @author : André Duarte Bueno Matrizes @param : Recebe uma matriz 2D @return : Retorna this */ CHistograma * CHistograma::Go (TCMatriz2D< int > *matriz) { // Desaloca(); // nx=pow(2,matriz->BitsPixel()); if (data1D) // Só calcula se os dados foram corretamente alocados { Constante (0); // zera o vetor histograma for (int j = 0; j < matriz->NY (); j++) // Percorre a imagem2D for (int i = 0; i < matriz->NX (); i++) { if (matriz->data2D[i][j] < this->NX ()) // evita acesso a ponto alem dos limites do vetor histograma data1D[matriz->data2D[i][j]]++; // incrementa } float area = matriz->NX () * matriz->NY (); // área total da imagem for (int k = 0; k < NX (); k++) // Percorre o histograma data1D[k] = static_cast < int >(data1D[k] * 100.0 / area); // coloca histograma no intervalo 0-100 } return this; }