Salve a tutti.
Ho questo esercizio da risolvere, ho provato a buttare giù un pò di codice, ma avrei bisogno di una mano.
Devo risolvere questo esercizio in assembler:
Dato un array di byte, invertire l'ordine dei bit all'interno dell'array.
non posso modificare le variabili già presenti.
Questo è il codice non modificabile, e il mio blocco in assembly
codice:
#include<stdio.h>
#include<stdlib.h>
void main()
{
#define MAX_LEN 100
//input
unsigned char vet[]={0x00,0x01};
unsigned int len=sizeof(vet)/sizeof(vet[0]);
//output
unsigned char res[MAX_LEN];
printf("%d\n",len);
//blocco asm
__asm{
XOR EAX,EAX //i
XOR EBX,EBX //SOMMATORIA
XOR ECX,ECX //CONTATORE
XOR AL,AL //NUMERO
XOR AH,AH //VERIFICA
XOR ESI,ESI //PER MOLT
MOV EAX,0
MOV EBX,0
MOV ECX,0
MOV AL,vet[EAX] //metto il vettore nel numero
COMINCIA: AND AL,128 //VERIFICA=NUMERO AND 128
MOV AH,AL
JMP INIZIO
INIZIO: CMP AH,1
JE CICLO//se non è uguale continuo:
SHL EDX,1//shift del numero
INC ECX//inc contatore
CMP ECX,8
JB INIZIO
INC EAX
MOV len,EBX
XOR EDX,EDX
JMP COMINCIA
CICLO:
//se il bit è1:
MOLTIPLICA:
MOV ESI,2
IMUL ESI
CMP ECX,0 //SE IL CONTATORE è 0 TI FERMI SE NO CONTINUI A MOLTIPLICARE
JNE MOLTIPLICA
ADD EBX,ESI
CMP ECX,8 //cmp contatore e 8
JB SALTO
INC EAX
CMP EAX,len
JNB FINE
JMP COMINCIA
SALTO: //se il contatore è minore di 8:
SHL EDX,1//shift del numero
INC ECX//incremento il contatore
JMP INIZIO
FINE:
}
//stampa
{
unsigned int i;
for(i=0;i<len;i++)
printf("res[%2d]=%10d(%08X)\n",i,res[i],res[i]);
system("pause");
}
}
Questo è il codice. C'è qualcuno che riesce a correggermelo???
E spiegarmi come funziona l'and, che non so come usarla..grazie mille!