View Full Version : HELP!: Elaborati!
Ciao ragazzi sono nuovo di qui.
Siccome la domenica di questa settimana devo consegnare gli elaborati avrei bisogno di un grande aiuto essendo in stato di malattia. Non riesco a capire cosa devo fare qui i ho studiato ma non sono capace di fare il diagramma di flusso. C'è qualcuno che mi può aiutare. Non copio per passare così ma per impare che poi in futuro se mi ricapiterà un problema simile saprò cosa fare. Mi potresta aiutare? Grazie
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 <stdio.h> //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
Cosa devo fare?
Grazie per la vostra futura collaborazione.
Cordialissimi saluti a tutti voi programmatori
Cristian Capannini
Ciao a tutti, spero che riusciate a risolvere questo problema.....vi ringrazierò un casino. Riesco adesso solo a studiare ce l'ho Lunedì prox l'esame quindi se potete risolvermelo entro giovedì se potete o max venerdì. Grazie a tutti. Ci tengo molto a passare questo esame e vorrei cortesemente essere aiutato.
Cosa devo fare?Scusa ... alcune domande: ma ti è stato richiesto espressamente di effettuare la ricerca/sostituzione interamente in assembly??? E in tal caso su quale S.O. deve girare e quale compilatore devi usare??? Nota che l'assembly in-line può differire da compilatore a compilatore come sintassi. ;)
Futuregames
19-06-2006, 23:00
devi stare attento se modifichi qualcosa nei registri non ti ritrovi la stessa cosa dopo...
le variabili possono essere memorizzate pure su alcuni registri quindi io ti consiglio di "salvare il contesto" cioè di mettere il contenuto di tutti i registri principali nello stack:
push(AX);
push(BX);
ecc...
poi alla fine delle tue robe in assembly
fai i pop... (al contrario di come li hai messi cioè prima bx poi ax) cmq guarda le documetazioni in giro io nn mi ricordo + bene il tutto :)
infine fai il print
Ehm grazie comunque però come lo impostereste voi?
Vi dico che sto lavorando con Visual Studio C++ 6.0.
Su xp e con visual studio 6.0 c++. Cioè il programma quando lo esequi deve cambiare solo la sottostringa "Stringa" con "mela" uitilizzando i registri.
Bisogna convertire la parola? O bisogna fare il CMP fino a che non trova la parola stringa se si sostituisci e vai avanti a cercare anche la seconda sottostringa uguale alla prima se no cerca finchè la ogni sotto stringa non sia la parola "stringa" una volta sostituisce le due sottostringhe con "mela".
Come si fa?
PS: Bisogna che lo consegno domenica perchè se no non posso andare all'esame e ci tengo tanto.
Grazie
ehm vi ringrazio della vostra collaborazione........ :mad: :mad: :mad: :mad:
Guarda ... cerco io di aiutarti (per quello che posso, ovviamente).
Il mio primo dubbio è questo: nell'array stringa se devi sostituire "stringa" con "mela" in pratica accorci la stringa. Devi per forza operare su un solo array o puoi usare un array "di output"???
Allungare/accorciare una stringa non è proprio molto comodo!!
Ehm ho visto questa cosa a fianco:
Input: la stringa in cui effettuare la sostituzione, la stringa da cercare e quella con cui sostituirla (Tutti array di BYTE terminanti con 0)
Output: la stessa stringa modificata
N.B: LA STRINGA MODIFICATA DEVE ESSERE TERMINATA DA UN CARATTERE NULLO (BYTE 0) ESATTAMENTE COME LE STIRNGHE DI INPUT.
SI SUPPONGA CHE IL BUFFER DI MEMOORIA CUI CORRISPONDE LA STRINGA DA MODIFICARE SIA SEMPRE SUFFICIEMENTE AMPIO PER IL RISULTATO.
PS. Vuoi che ti invio il testo degli elaborati da fare entro se è possibile sabato....se è possibile...solo il 2° no perchè l'ho fatto perchè mi sembrava il più facile tra quegli altri due. Potreste aiutarmi? Grazie della tua attenzione micetto (scusa se ti chiamo così perchè ho visto l'avatar del gattino che è il mio animale preferito! e ne ho 12 in casa mia identici al tuo avatar 7 li ho chiamati come i 7 nani e gli altri 3 come i tre re magi <= :fagiano: CHE IDIOTA CHE SONO NON E' VERO?). Comuqneu ti ringrazioerò e non so come del tuo aiuto. Il secondo è stato più facile perchè ho fatto già un'esercizio precedente. Ah giusto quello della parità dei dispari o parità pari e quello della ricerca della sotto stringa sono simili a due elaborati che ho fatto ma non sono in grado di estenderli se te li invio e mi dai una mano, che ne dici? Grazie
Cordialissimissimissimi saluti al micetto (se è possibile vorrei sapere il suo nome, io mi chiamo Cristian)
Ciao Ciao
/********************************************************************************
* *
* Architetture dei sistemi di Elaborazione *
* *
********************************************************************************
Esercizio: 003
Descrizione: Ricerca di un carattere in una stringa
********************************************************************************/
questo come dice il titolo fa una ricerca del carattere di una stringa
#include <stdio.h>
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);
}
/********************************************************************************
* *
* Architetture dei sistemi di Elaborazione *
* *
********************************************************************************
Esercizio: 006b
Descrizione: Calcolare la parità di un vettore di byte (Seconda Versione)
********************************************************************************/
#include <stdio.h>
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
}
// Stampa su video
printf("Ris=%d\n",Ris);
}
e questo potrebbe aiutarmi a risolvere l'altro elaborato?
Posso darti come "input" questo codice:
#include <stdio.h>
int main (void)
{
char stringa[1024] = "Questa stringa e' una stringa";
char str1[] = "stringa";
char str2[] = "mela";
__asm
{
lea esi,stringa
lea edi,str1
call compara_str
jmp end_asm
/* INPUT:
* esi = puntatore alla stringa 1
* edi = puntatore alla stringa 2
* OUTPUT:
* Z = 1 (stringhe uguali)
* Z = 0 (stringhe diverse)
*/
compara_str:
push esi
push edi
compara_str_loop1:
mov al,[esi]
cmp al,[edi]
jne compara_str_end
cmp al,0
je compara_str_end
inc esi
inc edi
jmp compara_str_loop1
compara_str_end:
pop edi
pop esi
ret
end_asm:
}
return 0;
}È solo un esempio, comunque.
La sub-routine compara_str si occupa di verificare se 2 stringhe sono esattamente uguali oppure no.
A quel punto, tenendo edi che punta a str1, bisogna partire dal primo carattere di stringa e andare avanti per cercare se ad un certo punto si trova la stringa in str1.
L'unica cosa è che da "stringa" a "mela" accorci e non crea troppi problemi ma se la stringa da sostituire fosse più lunga, sarebbe più un casino. Credo che ti convenga usare un buffer temporaneo, se ti è possibile (cioè se ti va bene).
P.S.: poi comunque prova a "buttare" giù qualcosa tu.
adesso lo provo ti ringrazio che cosa e quanto ti devo? Te lo dico senza scherzare. Dimmi quanto ti devo e però pensavo con cosa sdebitarmi? Ti mando un mega complimenti per il tuo aiuto...e l'altro hai provato a darci un'occhiata....grazie grazie grazie e ehm giuuuuso :doh: che cos'è il buffer temporaneo che non ho capito bene a cosa servi?
Ciao ragazzi sono nuovo di qui.
Siccome la domenica di questa settimana devo consegnare gli elaborati avrei bisogno di un grande aiuto essendo in stato di malattia. Non riesco a capire cosa devo fare qui i ho studiato ma non sono capace di fare il diagramma di flusso. C'è qualcuno che mi può aiutare. Non copio per passare così ma per impare che poi in futuro se mi ricapiterà un problema simile saprò cosa fare. Mi potresta aiutare? Grazie
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 <stdio.h> //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
Cosa devo fare?
Grazie per la vostra futura collaborazione.
Cordialissimi saluti a tutti voi programmatori
Cristian Capannini
Fai scienze dell'informazione a cesena per caso?
Anche io devo consegnare questi elaborati.
:ciapet: Ehm si ma non copiare ok? :ciapet: . Chi sei?
adesso lo provo ti ringrazio che cosa e quanto ti devo? Te lo dico senza scherzare. Dimmi quanto ti devo e però pensavo con cosa sdebitarmi? Ti mando un mega complimenti per il tuo aiuto...e l'altro hai provato a darci un'occhiata....grazie grazie grazie e ehm giuuuuso :doh: che cos'è il buffer temporaneo che non ho capito bene a cosa servi?Chiedo veramente scusa! Ho fatto un "piccolo" errore: la sub-routine compara_str non è proprio quello che serve. È giusta di per se .... ma non va bene per il tipo di test che devi fare tu!! Quando l'ho scritta chissà perché stavo pensando alla funzione strcmp() del "C". :muro: :muro:
Adesso non ho molto tempo, appena ho un attimo domani la riscrivo bene bene.
Sorry. :doh:
P.S. per buffer temporaneo intendevo una cosa del genere:
char stringa[200] = "Questa stringa e' una stringa";
char buffer[200];
non ti preoccupare capita ( :) errare è umano! :) ) vada tranquillo a me serve entro la consegna e cioè domenica questa se è possibile che così almeno posso passare l'esame. Se non stessi male così tanto oggi ho 38 di febbre ma studio comunque dannata febbre! :muro: :muro: :muro: :muro: Lei non sa quanto ci tengo....o forse sì.... E poi se lei può provare per quell'altro :rolleyes: ? Grazie dopo mi direte voi come :read: sdebitarmi :read: ....
Ciao AndBin ti consiglio prima di postarlo di mandarlo o nella mia email: criscap@libero.it ho nel mex privato grazie perchè quel ragazzo copia da tutti. :cry: :cry: :cry: :cry:
Posso postare questo codice che è solo una parte del codice che ho messo giù io.
Ovviamente devi completarlo tu! ;)
#include <stdio.h>
int main (void)
{
char stringa[200] = "Questa stringa e' una stringa";
char output[200];
char str1[] = "stringa";
char str2[] = "mela";
__asm
{
/*
.... tuo codice ....
*/
jmp end_asm
/* INPUT:
* esi = puntatore alla stringa
* OUTPUT:
* eax = lunghezza
*/
calcola_lunghezza:
push esi
xor eax, eax
calcola_lunghezza_loop:
cmp [BYTE PTR esi],0
je calcola_lunghezza_end
inc eax
inc esi
jmp calcola_lunghezza_loop
calcola_lunghezza_end:
pop esi
ret
/* INPUT:
* esi = puntatore alla stringa 1
* edi = puntatore alla stringa 2
* ecx = lunghezza
* OUTPUT:
* Z = 1 (stringhe uguali)
* Z = 0 (stringhe diverse)
*/
compara_str:
push ecx
push esi
push edi
cld
repz cmpsb
pop edi
pop esi
pop ecx
ret
end_asm:
}
printf ("Nuova stringa: %s\n", output);
return 0;
}
Ciao AndBin ti consiglio prima di postarlo di mandarlo o nella mia email: criscap@libero.it ho nel mex privato grazie perchè quel ragazzo copia da tutti. :cry: :cry: :cry: :cry:
Sarei io che copio da tutti?
Non so come tu faccia a saperlo visto che non sai nemmeno chi sono.
Se avessi letto un po' in giro comunque avresti visto che c'è un mio 3d dove chiedo consigli su alcune istruzioni perchè li sto facendo e non sto chiedendo a qualcun altro su internet di farmeli.
Ehm scusa perdonami perchè al Liceo mi hanno fatto sempre così. Ho vissuto periodi tragici non c'era una volt a che non mi incolpavano per aver fatto qualcosa. Comqunque fai come vuoi...ok....maaaa tu mi conosci? Se no è meglio. :D
Ehm grazie, lei si chiama Andrea (riferito a AndBin)? Grazie tantissime ora provo a farlo da solo se tutto va bene mi sdebiterò con te un casinotto. Ehm con l'altro elaborato come siete messo?
Ciao non mi potreste scriverlo voi in codice assembler perchè non ho tempo vi scongiuro di farli entro domani sera se potete perchè ci tengo tanto a passare l'esame. Lo so che vi chiedo troppo però se riuscireste a fermeli solo quei due e poi non vi chiedo più altro! Dopo ripeto e ribadisco mi sdebiterò ancora di più! Ti prego AndBin dammi una mano completa su questi due elaborati.
Ciao non mi potreste scriverlo voi in codice assembler perchè non ho tempo vi scongiuro di farli entro domani sera se potete perchè ci tengo tanto a passare l'esame. Lo so che vi chiedo troppo però se riuscireste a fermeli solo quei due e poi non vi chiedo più altro! Dopo ripeto e ribadisco mi sdebiterò ancora di più! Ti prego AndBin dammi una mano completa su questi due elaborati.
Io ho qualche dubbio che qualcuno abbia voglia di mettersi a fare completamente da 0 degli elaborati del genere, se guardi nell'altro 3d io ci sto lavorando su, possiamo darci una mano se vuoi ho postato del codice che non è per niente completo, c'è da metterci le mani e perderci su qualche ora probabilmente però è già un inizio, io non me la cavo tanto in assembler però qualcosa sto combinando.
Se riesci a sistemarlo per me lo puoi usare tranquillamente tanto la correzione è online e se il programma funziona il prof non ci guarda nemmeno.
Ok va bene ci vediamo domani pomeriggio.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.