Assembler: 2 esercizi da fare in asm

CrisLoveStefy
Ciao ragazzi sono uno studente ma che frequento il fuoricorso ho bisogno di una grandissimo aiuto! Per favore vi chiedo di aiutarmi l'esame si avvicina e il mio cervello ha consumato tutte le risorse possibili per fare questi 3 elaborati! Devo consegnare 3 elaborati di cui 1 l'ho fatto perchè mi è sembrato semplice. Mi potreste aiutare entro Domenica SE è possibile?
Grazie
ELABORATO 1

ELABORATO 1

Devo creare un programma che sostituisce tutte le occorrenze di una sottostringa all'interno di una stringa. Ad esempio ("Questa stringa è una stringa","stringa";"Mela") -> Questa mela è una mela. Non so se mi avete capito.

Io ho impostato il programma così:

#include //include la libreria stdio.h

void main()
{
//La stringa da modificare
char stringa[1024] = "Questa stringa e' una strina";
char str1[] = "stringa";
char str2[] = "mela";

__asm
{
che blocco devo implementare in assembler
}

printf("Nuova stringa: %s\n";stringa);

}

So benissimo che esistono i comandi di manipolazione della stringa e che sono:

LODS - leggi stringa
STOS - scrivi stringa
MOVS - copia stringa
CMPS - confronta due stringhe
SCAS - esamina stringa

HO TROVATO QUESTO MA NON RIESCO AD ESTENDERLO PER L'APPOSITO ESERCIZIO CHE DEVO FARE

#include


void main()
{
// Variabili
char Stringa[] = "Questa è una stringa";
int Lunghezza = sizeof(Stringa)-1;
char Carattere = 'è';
int Posizione;


// Blocco assembler
__asm {
MOV DL,Carattere ; Carattere da cercare in DL
MOV ECX,Lunghezza; Numero di caratteri
XOR EBX,EBX ; Azzera EBX
Ciclo: CMP EBX,ECX ; Ho superato la lunghezza ?
JGE NonTr
MOV AL,Stringa[EBX] ; Copia in AL il carattere EBX-esimo
CMP AL,DL ; Confronta i caratteri
JE Fine ; Trovato!
INC EBX ; Passa al carattere successivo
JMP Ciclo
NonTr: MOV EBX,-1 ; Carattere non trovato
Fine: MOV Posizione,EBX ; Trovato in posizione EBX
}


// Stampa su video
printf("Posizione=%d\n",Posizione);
}

ELABORATO 2

Data una sequenza di bit, sapendo che ogni n bit(di dati) vi è un bit di parità (1 se il numero di bit a 1 fra i precedenti n è dispai-9, verificare se vi sono errori.

#include

void main()
{
unsigned char vet[] = {2,4,67,2,2,58,99}; //sequenza di bit
unsigned int len = 55; // lunghezza numero di bit
unsigned char n=4 // numero di bit dati
unsigned char errori=0; // risultato (1= errori, 0=no errori)

__asm
{
qui devo inserire che blocco? mi potreste aiutare a crearlo?
}

printf("La sequenza di bit %s contiene errori\n",(errori?"":"non "));

}


-----------------------------------------------------------------
#include


void main()
{
// Variabili
unsigned char Vettore[] = {3,7,3,7,5,1,4};
unsigned int Lung = sizeof(Vettore)/sizeof(Vettore[0]);
int Ris; // 0: parità pari, 1: parità dispari


// Blocco assembler
__asm {
MOV ECX,Lung ; Lunghezza del vettore in ECX
XOR EDX,EDX ; Azzera EDX
Ciclo: XOR DL,Vettore[ECX-1] ;
LOOP Ciclo ; Continua finchè ECX è 0
TEST DL,DL; Il byte in DL ha la stessa parità dell'intera stringa
LAHF ; Carica i flag in AH
NOT AH ; Il flag di parità è 1 se la parità è pari: lo inverto
SHR EAX,10 ; Sposto il flag di parità sul primo bit di EAX
AND EAX,1 ; Mantengo solo il primo bit
MOV Ris,EAX ; Ris è 1 se il numero di bit a uno è dispari, 0
altrimenti
}
-----------------------------------------------

Cosa devo fare?
Grazie per la vostra futura collaborazione.
Cordialissimi saluti a tutti voi programmatori
Mi potreste creare voi il programma SE VOI potete?

Risposte
lorven
Ho ripensato alle sciocchezze che ho scritto nel post precedente,
ho scaricato un buon assembler/linker/debugger (TASM)
e ne è venuto fuori il seg. programma Assembly
(non riesco ancora a includerlo in un prg DevC++)

.MODEL small
.STACK 160h      ; Lunghezza stack

.DATA            ; Segmento dati
   Lbyte EQU 8   ; N. bit del carattere

   Len   DW 05   ; Lunghezza stringa Vet
   N     DW 20   ; Numero di bit su cui calcolare il bit di parità (lung. pacchetto)
   Error DB 0    ; 1=Errore di parità nella stringa; 0=ok
   
   Vet   DB 165  ; 5 chars da controllare (40 bit, 2 pacchetti)
         DB 7DH   
         DB 6CH
         DB 40H
         DB 91H  ; 1010 0101 0111 1101 0110 1100 0100 0000 1001 0001
   
.CODE               ; Segmento codice
Begin:

start:   nop        ; start segmento codice
   MOV   AX,@DATA   ; set up registro segmento dati
   MOV   DS,AX      ;
   MOV   ES,AX      ; set up ES
;---------------------------------------------------------------------------------------------------------------------------   
   MOV   AH,00H     ; Pulizia video
   MOV   AL,03H
   INT   10H
;---------------------------------------------------------------------------------------------------------------------------   
   XOR   SI,SI      ; Azzera indice vettore SI
   MOV   CX,Len     ; Lunghezza del vettore in CX
   XOR   BX,BX      ; Azzera BX=contatore dei bit =1
   XOR   AX,AX      ; AX=contatore bit esaminati nella stringa
   XOR   DH,DH      ; e DH=contatore bit esaminati nel byte attuale
;---------------------------------------------------------------------------------------------------------------------------   
Ciclo:
   MOV   DL,Vet[SI]   ; Carica in DL un carattere dal vettore
L1:
   CMP   DH,Lbyte     ; Se abbiamo elaborato un intero byte
   JGE   L3           ; passa al successivo
   CMP   AX,N         ; Confronta contatore bit esaminati con N
   JGE   L2           ; Se AX >= N, N bit del frame già esaminati, salta a L2
   INC   AX           ; altrimenti incrementa contatore bit esaminati in Vet
   INC   DH           ; e contatore bit esaminati nel byte attuale
   SHL   DL,1         ; Assegna a CF il 1. bit a sinistra
   JNC   BitZero      ; Se CF=0 va a BitZero per non incrementare BX
   INC   BX           ; altrimenti incrementa il contatore dei bit =1
BitZero:
   JMP   L1           ; e va ad esaminare un altro bit
L2:   
   TEST   BX,1        ; Verifica se contatore bit 1 è dispari
   JNZ   ErroreParità ; Se dispari, c'è un errore di parità
   XOR   AX,AX        ; altrimenti riazzera contatore bit esaminati
   JMP   L1           ; e continua ad elaborare i restanti bit
L3:
   INC   SI           ; Incrementa l'indice del vettore
   XOR   DH,DH        ; Azzera contatore bit esaminati nel byte attuale
   CMP   AX,N         ; Confronta contatore bit esaminati con N
   JL   L4            ; AX < N, ci sono ancora bit da esaminare nel pacchetto, salta a L4
   XOR   AX,AX        ; altrimenti riazzera contatore bit esaminati
   TEST   BX,1        ; Verifica se contatore bit 1 è dispari
   JNZ   ErroreParità ; Se dispari, c'è un errore di parità
L4:
   LOOP   Ciclo       ; Continua a meno che CX non sia 0
;---------------------------------------------------------------------------------------------------------------------------   
   MOV   Error,30h    ; Non ci sono errori di parità
   JMP   Fine         ; Salta alla stampa
ErroreParità:
   MOV   Error,31h    ; Trovato un errore di parità
;----------------------------------------------------------------------------------
Fine:   MOV   BH,00H  ; Stampa risultato su pagina video 0
   MOV   AL,Error     ; Byte da stampare in AL
   MOV   AH,0EH       ; in modo TTY
   INT   10H          ; Interrupt Bios
;---------------------------------------------------------------------------------------------------------------------------   
   MOV   AH,4CH       ; Funzione per uscire al dos
   INT   21H          ; Esce al dos

END Begin



Forse questo programma non interessa più, ma almeno questa volta funziona
(pare). :-)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.