Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79

    [ASSEMBLER] Dato un array di Byte, invertire l'ordine dei bit

    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!

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Perché le maschere e le addizioni?

    Io farei così la prima parte

    codice:
    	_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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79
    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..

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Sì ... corretto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2012
    Messaggi
    79
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.