Il mio programma è....
#include
#include
void main()
{
int numric;
char stringa[1024] = "Il tre è tre";
char str1[] = "tre";
char str2[] = "mela";
__asm
{
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
XOR EDX,EDX//Fine reset registri principali
MOV ECX,1024
Salvavettore:
MOV AL,stringa[ECX*1-1]
PUSH EAX
LOOP Salvavettore
MOV BL, 3//Intanto facciamo finta di aver calcolato la lunghezza di str1
LEA ESI,stringa[ECX]
DEC ESI
Inizio:
INC ESI
MOV AL,[ESI]
CMP AL,0
JE Fine
MOV AH,str1[ECX]
CMP AL,AH
JNE Parolasuccessiva
INC ECX
JMP Inizio
//Devo correggere la fine di una parola trovata identica (quando va in è
//fa casino
Parolasuccessiva:
XOR ECX,ECX
INC ESI
MOV AL,[ESI]
CMP AL,20h
JNE Parolasuccessiva
JMP Inizio
Fine:
}
printf("Numero ricorrenze: %d\n",numric);
}
Provate a cotrollare i registri con Visual Studio c++ e ditemi se c'è qualcosa che non va. Grazie.
#include
void main()
{
int numric;
char stringa[1024] = "Il tre è tre";
char str1[] = "tre";
char str2[] = "mela";
__asm
{
XOR EAX,EAX
XOR EBX,EBX
XOR ECX,ECX
XOR EDX,EDX//Fine reset registri principali
MOV ECX,1024
Salvavettore:
MOV AL,stringa[ECX*1-1]
PUSH EAX
LOOP Salvavettore
MOV BL, 3//Intanto facciamo finta di aver calcolato la lunghezza di str1
LEA ESI,stringa[ECX]
DEC ESI
Inizio:
INC ESI
MOV AL,[ESI]
CMP AL,0
JE Fine
MOV AH,str1[ECX]
CMP AL,AH
JNE Parolasuccessiva
INC ECX
JMP Inizio
//Devo correggere la fine di una parola trovata identica (quando va in è
//fa casino
Parolasuccessiva:
XOR ECX,ECX
INC ESI
MOV AL,[ESI]
CMP AL,20h
JNE Parolasuccessiva
JMP Inizio
Fine:
}
printf("Numero ricorrenze: %d\n",numric);
}
Provate a cotrollare i registri con Visual Studio c++ e ditemi se c'è qualcosa che non va. Grazie.
Risposte
Eh io lo saprei fare in C ma in VBA non ancora... I'm sorry!
Ma confrontarle in che senso?
Quello che voglio fare è un piccolo programma in ASM che confronta due stringhe ricercando quella uguale. Una volta fatto questo dopo provvederò a come sostituirla con un'altra
Quello che voglio fare è un piccolo programma in ASM che confronta due stringhe ricercando quella uguale. Una volta fatto questo dopo provvederò a come sostituirla con un'altra
Suppongo che si voglia cercare, in una data stringa, tutte le occorrenze di una sottostringa, per poi sostituirle con un'altra sottostringa. Il programmino postato è, purtroppo, un po' lontano da quello che servirebbe
.
Si limita a scorrere in parallelo due stringhe, fermandosi al primo carattere uguale; nell'esempio fornito, si confronta "P con "g", poi "i" con "i", e lì si ferma, trovandole uguali.

Si limita a scorrere in parallelo due stringhe, fermandosi al primo carattere uguale; nell'esempio fornito, si confronta "P con "g", poi "i" con "i", e lì si ferma, trovandole uguali.
Ti serve in C o in VB?
Con VB6 c'è replace,ad esempio.
Con VB6 c'è replace,ad esempio.
Le richieste di Cris sono poco chiare:
Mi pare che sia assembly!
__asm
{
XOR EAX,EAX
XOR EBX,EBX
MOV ECX,0
C: MOV AL,stringa[ECX]
MOV BL,str1[ECX]
CMP AL,BL
JE Fine
INC ECX
JMP C
Fine:
}
Mi pare che sia assembly!

Nepero87 ha detto che non sa farlo in VBA, quindi pensavo che gli servisse anche in VBA.
Mi pare che Cris abbia riproposto uno dei due esercizi asm di qualche tempo fa, che in qualche modo ha poi recuperato, ma adesso ha specificato che usa Visual Basic Professional 6.0
. Attendiamo chiarimenti.


Sì, hai perfettamente ragione. Avevo saltato la parte finale del suo messaggio e letto quello di nepero87.
Visto che Cris tace, assumendo che il programma richiesto sia in Assembly, posto una possibile soluzione.
E' integralmente ASM, non essendo ancora riuscito ad includere prg ASM in C/C++
Chiedo scusa per l'indent errato.
N.B.:
- questo programma ricerca solo la prima occorrenza della sottostringa;
- l'algoritmo non è il massimo di efficienza.
E' integralmente ASM, non essendo ancora riuscito ad includere prg ASM in C/C++

;---------------------------------------------------------------- .model small .data Stringa DB "Piano giallo","§" ; Stringa chiusa da § Str1 DB "giallo" ; sottostringa da ricercare ris DB "0" ; risultato: 1-esiste, 0-no ;---------------------------------------------------------------- .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 (seg. dati) ;---------------------------------------------------------------- MOV AH,00H ; pulizia video MOV AL,03H INT 10H ;---------------------------------------------------------------- XOR BX, BX ; azzera displacement di Stringa CLD ; direz. confronto stringhe in avanti l1: LEA SI, Stringa[BX] ; ciclo di ricerca ; si <-ind. 1° crt di Stringa da confr. LEA DI, Str1 ; di <-ind. della sottostringa MOV CX, 6 ; n° max crt da confrontare REPE CMPSB ; cfr. stringhe byte per byte JNE diversa ; se diverse, deve proseguire la ricerca ;---------------------------------------------------------------- uguale: MOV ris, "1" ; sottostringa trovata JMP fine ;---------------------------------------------------------------- diversa: INC BX ; incr. pos. iniz. di Stringa per ricerca CMP Stringa[BX], "§" ; Stringa finita? JE fine ; se sì, finisce JMP l1 ; altrim. torna al ciclo l1 ;---------------------------------------------------------------- Fine: MOV BH,00H ; Stampa risultato su pagina video 0 MOV AL, RIS ; 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 ;=================================================================
Chiedo scusa per l'indent errato.
N.B.:
- questo programma ricerca solo la prima occorrenza della sottostringa;
- l'algoritmo non è il massimo di efficienza.

Vaffanculo ho risolta grazie e addio per questo argomento....