Il mio programma è....

CrisLoveStefy
#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.

Risposte
nepero87
Eh io lo saprei fare in C ma in VBA non ancora... I'm sorry!

TomSawyer1
Ma confrontarle in che senso?

CrisLoveStefy
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

CrisLoveStefy
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

lorven
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.

TomSawyer1
Ti serve in C o in VB?

Con VB6 c'è replace,ad esempio.

lorven
Le richieste di Cris sono poco chiare:

__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! 8-)

TomSawyer1
Nepero87 ha detto che non sa farlo in VBA, quindi pensavo che gli servisse anche in VBA.

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

TomSawyer1
Sì, hai perfettamente ragione. Avevo saltato la parte finale del suo messaggio e letto quello di nepero87.

lorven
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++ :evil:
;----------------------------------------------------------------
.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.

:-)

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

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