Linguaggio Assembler

di il
4 risposte

Linguaggio Assembler

Salve, devo fare un compito:
Trovare la parola più lunga all’interno di una frase e cifrare/decifrare un
testo con il cifrario di Vigenère, usando come chiave la parola trovata.

#include <stdio.h>

void main()
{
    // Input
	char frase[1024] = "Cantami, o Diva, del Pelide Achille l'ira funesta che infiniti addusse lutti agli Achei";
	char testo[1024] = "Questo e' il testo da cifrare";
	char decifra = 0; // 0 = cifra; 1 = decifra
	
	// Output
	char parolaMax[100];	//La parola più lunga
	char risultato[1024]; 	//Il testo cifrato/decifrato

	// Blocco assembler
	__asm
	{

		XOR EBX,EBX //INDICE PER SPOSTARMI NELL' ARRAY: frase
		XOR EAX,EAX
		XOR EDX,EDX //INDICE SECONDA PAROLA
		XOR ESI,ESI
		XOR EDI,EDI
		XOR ECX,ECX //SALVO LA LUNGHEZZA DELLA PAROLA
	Ciclo:
		MOV AL,frase[EBX] 

		CMP EAX,20h //VEDE SE è UNO SPAZIO                                         ///////////EBX è LA LUNGHEZZA DELLA PAROLA//////////
		JE NoCarattere
		CMP EAX,2ch //VEDE SE è ,
		JE NoCarattere
		CMP EAX, 2eh //VEDE SE è .
		JE NoCarattere
		CMP EAX, 3ah //VEDE SE è :
		JE NoCarattere
		CMP EAX, 3bh //VEDE SE è ;
		JE NoCarattere
		CMP EAX, 27h //VEDE SE è '
		JE NoCarattere
		CMP EAX, 3fh //VEDE SE è ?
		JE NoCarattere
		CMP EAX, 21h //VEDE SE è !
		JE NoCarattere

		MOV parolaMax[EBX],AL
		INC EBX
		MOV ECX,EBX
		JMP Ciclo
	NoCarattere:
		INC EBX
		MOV AL, frase[EBX]

		CMP EAX, 20h //VEDE SE è UNO SPAZIO
		JE NoCarattere
		CMP EAX, 2ch //VEDE SE è ,
		JE NoCarattere
		CMP EAX, 2eh //VEDE SE è .
		JE NoCarattere
		CMP EAX, 3ah //VEDE SE è :
		JE NoCarattere
		CMP EAX, 3bh //VEDE SE è ;
		JE NoCarattere
		CMP EAX, 27h //VEDE SE è '
		JE NoCarattere
		CMP EAX, 3fh //VEDE SE è ?
		JE NoCarattere
		CMP EAX, 21h //VEDE SE è !
		JE NoCarattere
		
		JMP NoCarattere
	}

	// Stampa a video
	printf("Frase: %s\n", frase);
	printf("Testo: %s\n",testo);
	printf("Parola piu' lunga: %s\n", parolaMax);
	// Stampa su video testo cifrato
	printf("Risultato: %s\n", risultato);
	printf("Risultato (in esadecimale):\n");
	// N.B. Nella stringa precedente alcuni caratteri possono non essere stampabili: 
	//		crea anche una stringa con tutti i caratteri come codici ascii esadecimali
	char* t = risultato;
	while (*t)
	{
		printf("\\x%02X", (unsigned char)(*t++));
	}
}
lo scheletro del programma è in linguaggio C mentre noi dobbiamo scrivere il programma dentro il blocco assembler.
Il problema è che io non so come fare a caricare un altra parola (magari nei registri esi edi) e poi confrontarla con parola max e se più grande scriverla in parola max appunto.
Mi viene da pensare le funzioni per le stringhe però avrei bisogno di aiuto
Grazie

4 Risposte

  • Re: Linguaggio Assembler

    Ma quel codice chi l'ha scritto?
  • Re: Linguaggio Assembler

    Il codice al di fuori del blocco assembler ci è stato fornito
  • Re: Linguaggio Assembler

    Intendevo il codice del blocco assembly
  • Re: Linguaggio Assembler

    Io
    comunque riporto anche la descrizione
    
    Descrizione: Data una stringa C (terminata dal carattere nullo), contenente una
    			 frase (ossia parole separate da spazi e/o segni di punteggiatura),
    			 trovare al suo interno la parola più lunga e successivamente 
    			 cifrare/decifrare un testo con il cifrario di Vigenère, usando come
    			 chiave la parola trovata.
    
    Note:
    - In caso di parole di uguale lunghezza, considerare la prima da sinistra.
    - La parola più lunga va copiata in un array di caratteri come stringa C
      (terminata dal carattere nullo).
    - I segni di punteggiatura da considerare sono: ".,;:'?!"
    - Nel testo cifrato il codice ASCII di ogni carattere è aumentato del codice ASCII
      del corrispondente carattere nella parola chiave sovrapposta (e ripetuta se
      necessario) al testo.
    
Devi accedere o registrarti per scrivere nel forum
4 risposte