ciao a tutti!
ho un problema con un programma di assembler...
io dovrei, dato un array di byte, invertire l'ordine dei bit... quindi se come numero ho 10011000 devo ottenere 00011001.... e dovrei anche poi invertire di posizione questi numeri all'interno dell'array (es: {1,2,3} {3,2,1} ) ma per ora ho tralasciato questa parte...
mi sono dedicata all'invertire i vari bit...
facendo su visual studio il debug e guardando i registri, vedo che i primi due numeri del vettore me li inverte...il terzo no.. ma i primi due si...
(gli inversi sono {0x55,0x90,0x3F})
se faccio partire senza debug (addirittura quindi fare la stampa a video del risultato) però non mi da i numeri (almeno i primi 2) giusti..ma mi appare questo..
http://i277.photobucket.com/albums/k...atitolo1-3.png
non capisco l'errore o.o dovrebbe essere tutto a posto...
RAGIONAMENTO
ho il numero e la mia maschera..shifto a destra il numero.. se il Carry è 1 allora significa che deve essere 1 il primo bit del numero invertito...in quel caso faccio ADD tra la maschera e il mio numero e shifto la maschera per il bit successivo... nel caso invece il carry fosse 0 shifto la maschera ma non faccio ADD. e controllo anche che la maschera non sia 0, in quel caso ho finito di shiftare il numero e lo sposto nella cella del vettore risultato..
quando ho finito il numero incremento anche l'indice del vettore..per spostarmi al numero successivo..
codice:
#include <stdio.h>
void main()
{
#define MAX_LEN 100
//input
unsigned char vet[]={0xAA,0xFC,0x09};
unsigned int len=sizeof(vet)/sizeof(vet[0]);
//output
unsigned char res[MAX_LEN];
_asm {
XOR EAX,EAX //contenuto cella dell'array
XOR EBX,EBX //lo uso come maschera
XOR ECX,ECX //uso per scorrere il vettore
XOR EDX,EDX //indice nuovo numero con numeri invertiti
riparti: MOV AL,vet[ECX] //metto il contenuto della prima cella in AL
MOV BL,0x80 //sposto il bl la mia maschera
ciclo: SHR AL,1 //shifto il numero
JC bit_1 //controllo il riporto, se è 1
JNC bit_0 //se il flag è 0 shifto
bit_0: SHR BL,1
JZ numero_finito
JMP ciclo
bit_1:
ADD AL,BL //add tra il numero e la mia maschera
SHR BL,1 //sposto la maschera di 1 a destra
JZ numero_finito
JMP ciclo
numero_finito: MOV res[EDX],AL //sposto il numero invertito nel vettore risultato INC ECX //incremento l'indice del vettore per passare al successivo numero da invertire CMP ECX,len //controllo se ho finito tutto il vettore, in quel caso finisce il programma JE fine
JMP riparti
fine: //QUI METTO IL PROCEDIMENTO PER INVERTIRE DI ORDINE I NUMERI NELL'ARRAY }
{
unsigned int i;
for(i=0;i<len;i++)
printf("res[%2d] = %10d (%08X)\n",i,res[i],res[i]);
}
}
non posso toccare le variabili in C..
sapete aiutarmi?? grazie infinite ç_ç se serve mando anche il rar con il progetto intero...
grazie ancora ç_ç ci ho lavoratto tutto il giorno.ed ora spengo perchè i miei occhi ormai non reggono più!
Grazie infinite!