PDA

Visualizza la versione completa : [ASSEMBLER] Dato un array di Byte, invertire l'ordine dei bit


JErikaM
11-06-2012, 18:15
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/kk71/ErikaSparrow/Senzatitolo1-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..



#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!

oregon
11-06-2012, 19:48
Perch le maschere e le addizioni?

Io farei cos la prima parte



_asm
{
XOR EBX,EBX
MOV ECX,len
MOV EDX,ECX
oneByte:
PUSH ECX
DEC EDX
MOV ECX,8
MOV AL,vet[EBX]
oneBit:
SHR AL,1
RCL res[EDX],1
DEC CX
JNZ oneBit
INC EBX
POP ECX
DEC CX
JNZ oneByte }


per risolvere in un sol colpo tutti e due i problemi ...

JErikaM
11-06-2012, 22:57
grazie, domani apoena vado al computer lo provo e me lo guardo x bene..quindi qui se ho capito bene oltre ad invertire i bit metti gia' i numeri in posizione giusta nel vettore vero? partendo dall ultima cella con l inserimento..

oregon
11-06-2012, 23:20
S ... corretto ...

JErikaM
12-06-2012, 08:51
l'ho provato e ne confermo il perfetto funzionamento :) ora me lo trascrivo su carta e me lo analizzo per bene :)
ti ringrazio infinitamente per la tua gentilezza :)
vedo se controllando il tuo riesco a capire dove ho sbagliato io ^^
grazie ancora :)

Loading