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).