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
CrisLoveStefy
:( :( :( :( :( Vi prego dovete aiutarmi ci tengo tanto a dare quest'esame. So che i professori sono un pò stronzetti perchè scusa.....devi aver fatto tutti e tre elaborati per entrare a fare l'esame? Non è possibile. Quindi vi scongiuro di aiuarmi solo una volta e poi mi arrangerò dasolo vi prego!
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! :( :( :( :( :( :( :(

CrisLoveStefy
Ok ho visto che nessuno mi aiuta e quindi......come al solito sono un fallito. Grazie per la vostra collaborazione. Aspetto risposte......

TheWiz@rd
già... hai capito benissimo cosa sei!

Pablo5
guarda che la programmazione in assembler non è una cosa che immediata e diffusa come il c++ (per esempio)

stellacometa
"TheWiz@rd":
già... hai capito benissimo cosa sei!


Nooo ma dai..non puoi dare risposte del genere..non è carino da parte tua!

TheWiz@rd
Mha... non credo di aver detto chissà che cosa. E poi, se l'e cercata. :twisted:

CrisLoveStefy
Innanzitutto ringrazio :D stellacometa :D 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?

stellacometa
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?

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!

eugenio.amitrano
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

#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;
}

eugenio.amitrano
@Tutti
Come mai viene visualizzata una indentazione sfalsata ?

stellacometa
"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 :cry: :cry: Non puoi abbandonare!! Dai..prova! Non tutti riescono a primo approccio.. Che cavolo..se lo sapessi ti aiuterei io!!! Qui ci vorrebbe il mitico lorven!!! :(

eugenio.amitrano
Leggendo gli esempi forse risesco ad aiutarti.
Vogli prima pero' fare una piccola ripetizione.

A presto,
Eugenio

eugenio.amitrano
Per iniziare ho provato a tradurre questa parte del blocco:

  /* 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

lorven
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.
:-)
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 :roll:

CrisLoveStefy
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!

CrisLoveStefy
Salve mi potreste indicare il miglior libro per imparare l'assembler dell'8087? oppure 8086? Grazie.

stellacometa
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!

_luca.barletta
Se sei un appassionato, questa non ti dovrebbe mancare mai:
http://www.ul.ie/~rinne/datasheets/8086.pdf

CrisLoveStefy
Vi ringrazio molto per i link così me li stampo tutti in facoltà e li rilego gratuitamente :-)!

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