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





Fatemi questi due esercizi devo consegnarli entro domani o alneno entro lunedì. Vi prego sul serio devo almeno sostenere quest'esame. Grazie e mi sdebiterò un casino a chi mi ha aiutato!







Ok ho visto che nessuno mi aiuta e quindi......come al solito sono un fallito. Grazie per la vostra collaborazione. Aspetto risposte......
già... hai capito benissimo cosa sei!
guarda che la programmazione in assembler non è una cosa che immediata e diffusa come il c++ (per esempio)
"TheWiz@rd":
già... hai capito benissimo cosa sei!
Nooo ma dai..non puoi dare risposte del genere..non è carino da parte tua!
Mha... non credo di aver detto chissà che cosa. E poi, se l'e cercata.

Innanzitutto ringrazio
stellacometa
per avermi rispettato. Veramente sono io che chiedo come si dice "pappa fatta" e dovrei scusarmi per questo. Sono stato abituato così e purtroppo nessuno deve mettere in discussione il mio carattere....quindi chiedo infinitamente scusa per come mi sono comportato....ma il problema dell'elaborato 1 mi ha aiutato il mio compagno che dopo mille tentativi di chiamata al cellulare è riuscito a rispondermi......ma mi manca solo l'elaborato quello dei bit che devo consegnarlo entro stasera o stanotte. Come faccio ad accedere all'n-esimo elemento e poi a contare i bit e a verificare se a bit di parità pari o dispari? Quali sono i comandi principali? Grazie.
PS: "Abbiate più rispetto e otterrete molta colaborazione" questo è il modo di comportarsi in un forum. Me l'ha detto mio padre che gestisce il forum del LFGM. Laboratorio Fondazioni Guglielmo Marconi.
Dove posso trovare un manuale completo di assembler per comprarlo? Magari a basso costo?


PS: "Abbiate più rispetto e otterrete molta colaborazione" questo è il modo di comportarsi in un forum. Me l'ha detto mio padre che gestisce il forum del LFGM. Laboratorio Fondazioni Guglielmo Marconi.
Dove posso trovare un manuale completo di assembler per comprarlo? Magari a basso costo?
Tempo fa ero partita sparata per imparare assembly ma poi mi sono dovuta ricredere che prima ho ancora molto da imparare..però "pascolando" per il web ho trovato utile questo:
http://www.giobe2000.it/Tutorial/index.htm
Che ne pensi?
http://www.giobe2000.it/Tutorial/index.htm
Che ne pensi?
grazie del link ma forse deciderò di abbandonare l'univerrsità e di studiare fuoricorso.......non riesco a fare il problema elaborato 3 quello dei bit di parità....mi sento un fallito....grazie tante stellina!
Per il momento ho letto solo l'Elaborato 1
Non so se cio' che ho fatto puo' aiutarti.
Purtroppo sono troppi anni che non tocco l'assembler e cosi' ti ho scritto una funzione in c senza utilizzare nessuna libreria e senza utilizzare funzioni, in modo da permetterti una piu' facile traduzione del BLOCCO.
Se ti torna utile questo tipo di aiuto, fammelo sapere che verifico anche gli elaborati 2 e 3.
A presto,
Eugenio
Non so se cio' che ho fatto puo' aiutarti.
Purtroppo sono troppi anni che non tocco l'assembler e cosi' ti ho scritto una funzione in c senza utilizzare nessuna libreria e senza utilizzare funzioni, in modo da permetterti una piu' facile traduzione del BLOCCO.
Se ti torna utile questo tipo di aiuto, fammelo sapere che verifico anche gli elaborati 2 e 3.
A presto,
Eugenio
#define NO_ERRORS 0 #define BAD_PARAMETERS -1 /* Funzione: iSubStringChange Descrizione: Questa funzione sostituisce la sOldSubString con la sNewSubString in sString */ int iSubStringChange(char *sString, const char *sOldSubString, const char *sNewSubString) { int iStringSize = 0; // Dimensione sString; int iOldSubStringSize = 0; // Dimensione sOldSubString int iNewSubStringSize = 0; // Dimensione sNewSubString int i, j, k, iCount; // Variabili indici e contatori // Calcola la lunghezza delle stringhe while(sString[iStringSize] != '\0') { iStringSize++; }; while(sOldSubString[iOldSubStringSize] != '\0') { iOldSubStringSize++; }; while(sNewSubString[iNewSubStringSize] != '\0') { iNewSubStringSize++; }; // Verifica se i parametri sono corretti if( !iStringSize || !iOldSubStringSize || !iNewSubStringSize || iStringSize < iOldSubStringSize) return BAD_PARAMETERS; /* INIZIO DEL BLOCCO */ // Scansione della sString for(i = 0; i <= iStringSize - iOldSubStringSize; i++) { // Cerca sOldSubString in sString iCount = 0; for(j = 0; j < iOldSubStringSize; j++) if(sString[i + j] == sOldSubString[j]) iCount++; // Parola trovata if(iCount == iOldSubStringSize) { // Eliminazione di sOldSubString for(j = i; j <= iStringSize - iOldSubStringSize; j++) sString[j] = sString[j + iOldSubStringSize]; // Ricalcolo della iStringSize iStringSize = 0; while(sString[iStringSize] != '\0') { iStringSize++; }; // Inserimento di sNewSubString for(j = iStringSize + iNewSubStringSize; j >= i; j--) if(j >= i + iNewSubStringSize) sString[j] = sString[j - iNewSubStringSize]; else sString[j] = sNewSubString[j - i]; } // Ricalcolo della iStringSize iStringSize = 0; while(sString[iStringSize] != '\0') { iStringSize++; }; } /* FINE DEL BLOCCO */ return NO_ERRORS; }
@Tutti
Come mai viene visualizzata una indentazione sfalsata ?
Come mai viene visualizzata una indentazione sfalsata ?
"CrisLoveStefy":
grazie del link ma forse deciderò di abbandonare l'univerrsità e di studiare fuoricorso.......non riesco a fare il problema elaborato 3 quello dei bit di parità....mi sento un fallito....grazie tante stellina!
Noooooo



Leggendo gli esempi forse risesco ad aiutarti.
Vogli prima pero' fare una piccola ripetizione.
A presto,
Eugenio
Vogli prima pero' fare una piccola ripetizione.
A presto,
Eugenio
Per iniziare ho provato a tradurre questa parte del blocco:
in questo:
Ho provato a compilare e purtroppo non compila.
E' sintatticamente scorretto, ma credo che il concetto lo sia.
In pochi minuti non sono riuscito a riprendere, pero' cerchero' di farlo.
Sono sicuro che riuscirai a tradurre meglio di me.
A presto,
Eugenio
/* INIZIO DEL BLOCCO // Scansione della sString for(i = 0; i <= iStringSize - iOldSubStringSize; i++) { // Cerca sOldSubString in sString iCount = 0; for(j = 0; j < iOldSubStringSize; j++) if(sString[i + j] == sOldSubString[j]) iCount++; // Parola trovata if(iCount == iOldSubStringSize) { // Eliminazione di sOldSubString for(j = i; j <= iStringSize - iOldSubStringSize; j++) sString[j] = sString[j + iOldSubStringSize]; } } FINE DEL BLOCCO */
in questo:
_asm { JMP Start: Found: MOV CL,iStringSize PUSH BX MOV BL,iOldSubStringSize DEC BL XOR BH,BH Ciclo5: CMP BH,BL JE Next5 DEC CL INC BH Next5: POP BX MOV CH,BH Ciclo3: CMP CH,CL JE Next3 MOV DL,CH PUSH CX MOV CL,iOldSubStringSize DEC CL XOR CH,CH Ciclo4: CMP CH, CL JE Next4 INC DL INC CH Next4: POP CX MOV sString[CH], sString[DL] INC CH JMP Ciclo3 Next3: JE Continue Start: MOV BL,iStringSize XOR BH,BH Ciclo1: CMP BH,BL JE Next1 XOR DL,DL MOV DH,iOldSubStringSize DEC DH MOV CL,DH XOR CH,CH Ciclo2: CMP CH,CL JE Next2 PUSH CX PUSH BX MOV CH,iOldSubStringSize DEC CH XOR CL,CL Ciclo6: CMP CH,CL JE Next6 DEC BH INC CL JMP Ciclo6 Next6: MOV AL,sString[BH] POP BX POP CX MOV AH,sOldSubString[CL] CMP AL,AH INC DL INC CH JMP Ciclo2 Next2: CMP CL,DL JE Found Continue: INC BH JMP Ciclo1 Next1: }
Ho provato a compilare e purtroppo non compila.
E' sintatticamente scorretto, ma credo che il concetto lo sia.
In pochi minuti non sono riuscito a riprendere, pero' cerchero' di farlo.
Sono sicuro che riuscirai a tradurre meglio di me.
A presto,
Eugenio
Chiedo scusa se mi faccio vivo solo adesso.
Premetto che ho lasciato, ahimè, l'assembly molto tempo fa e, praticamente, non me lo ricordo più.
Quanto segue è un tentativo (pessimo) di soluzione, non verificato
(non ho l'ambiente di sviluppo Assembler e non mi funziona in C),
sicuramente con errori.
Lo posto sperando possa essere, almeno in qualche modo, utile.
Sono ben accette critiche e correzioni.


Dovrebbe verificare che, in ogni gruppo di N bit del vettore, ci sono bit 1 in numero pari
Premetto che ho lasciato, ahimè, l'assembly molto tempo fa e, praticamente, non me lo ricordo più.

Quanto segue è un tentativo (pessimo) di soluzione, non verificato
(non ho l'ambiente di sviluppo Assembler e non mi funziona in C),
sicuramente con errori.
Lo posto sperando possa essere, almeno in qualche modo, utile.
Sono ben accette critiche e correzioni.

MOV SI,Len ; Lunghezza del vettore in SI (indice) MOV CX,Len ; Lunghezza del vettore in CX (contatore) XOR DX,DX ; Azzera DX XOR BX,BX ; BX XOR AX,AX ; e AX Ciclo: DEC SI ; Decrementa l'indice del vettore MOV DL,Vet[SI] ; Carica in DL un carattere L1:INC AX ; Incrementa contatore bit esaminati CMP AX,N ; e lo confronta con N JGE L2 ; Se AX >= N, N bit già esaminati, salta a L2 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à LOOP Ciclo ; Continua finchè CX non diventa 0 MOV Errori,0 JMP Fine ErroreParità: MOV Errori,1 Fine:

Dovrebbe verificare che, in ogni gruppo di N bit del vettore, ci sono bit 1 in numero pari

Grazie dell'incoraggiamento stellina. Non ti preoccupare ormai non lo sostengo più.
Grazie eugenio salverò questo pezzo di forum e me lo leggerò con calma sul treno. Grazi e buon lavoro a tutti!
Grazie eugenio salverò questo pezzo di forum e me lo leggerò con calma sul treno. Grazi e buon lavoro a tutti!
Salve mi potreste indicare il miglior libro per imparare l'assembler dell'8087? oppure 8086? Grazie.
http://www.newbie.it/manuali/manuali2.a ... ca=registr
Se vai in questo link trovi il secondo download che penso ti possa essere utile!! Però sono solo degli appunti!
Se vai in questo link trovi il secondo download che penso ti possa essere utile!! Però sono solo degli appunti!
Se sei un appassionato, questa non ti dovrebbe mancare mai:
http://www.ul.ie/~rinne/datasheets/8086.pdf
http://www.ul.ie/~rinne/datasheets/8086.pdf
Vi ringrazio molto per i link così me li stampo tutti in facoltà e li rilego gratuitamente
!
