Assembler: 2 esercizi da fare in asm
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?
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
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
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++)
Forse questo programma non interessa più, ma almeno questa volta funziona
(pare).
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).
