Era l'unico errore in fase di compilazione
comunque il file della routine assembly è la seguente:
la routine dimensioni serve solo a calcolare la dimensione della routine
codice per la routine Trova_Stringa
(quella da testare)
;-----------------------------------------------------------------------
;* Programma : Cerca una Stringa. *
;* File : Rocky.asm *
;* Data : 25-05-2021 *
;* Scopo : Uso Generale. *
;* Routine : Trova_Stringa. *
;* Libreria : Babele. *
;* Prototipo C++ : extern "C" int__stdcall Trova_Stringa( struct *
;* Parametro_Trova_Stringa &sorgente,int &dimeroutine); *
;* Par.Input : Stringa Sorgente e Stringa Cercare. *
;* Par.Output : Posizione Stringa Trovata e Volte trovata. *
;* Errori Gestiti : *
;* ========================================================== *
;* 00 | Stringa non Trovata. *
;* 01 | Stringa Trovata. *
;* 35 | Stringa non Valida. *
;* 42 | Parametro Nullo o non Valido. *
;* 43 | Dimensione dei Parametri Differenti o non Congrui. *
;* 56 | Parametro Duplicato. *
;* XX | Errore derivante da SubRoutine. *
;* ========================================================= *
;* Byte su Disco : 13.178 Byte in Memoria : ... Test : ......... *
;-----------------------------------------------------------------------
.486
.model flat, stdcall
option casemap:none
.data
routine dd ?
dove dd ?
cosa dd ?
align 4
jmperrore dd A001L,E0001,E0002,E0003,E0004,E0005,E0006
include e:\classe numerica\test\include\cerca.sam
include e:\classe numerica\test\include\parametri\parametro_trova_stringa.sam
superenalotto Cerca <?>
sting Parametro_Trova_Stringa <?>
luncerca dw ?
lunsorge dw ?
primapos dw ?
posnew dw ?
poscan dw ?
ncartrovati db ?
trovate db ?
errore db ?
.code
extern Cleareg@0:proc,Dimensioni@16:proc,Hawkeyes@8:proc,
LenStringa@8:proc
LenStringa Equ LenStringa@8
Dimensioni Equ Dimensioni@16
Hawkeyes Equ Hawkeyes@8
Cleareg Equ Cleareg@0
include macro\calcola_dimensione_routine.mac
Trova_Stringa proc Arg1:Dword,Arg2:Dword
pusha
Calcola_Dimensione_Routine errore,routine,A0013,Arg2,E0000
A0000: mov errore,0
mov posnew,0 ;---------------------------------
mov primapos,0 ;* Imposta Riferimenti Iniziali. *
mov poscan,0 ;---------------------------------
mov ncartrovati,0
mov trovate,0
mov lunsorge,0
mov luncerca,0
Assume Esi:ptr Parametro_Trova_Stringa
Assume Edi:ptr Parametro_Trova_Stringa
mov esi,Arg1
mov edi, offset sting
mov edx,[esi].dove ;----------------------------
mov [edi].dove,edx ;* decomprime i parametri. *
mov edx,[esi].cosa ;----------------------------
mov [edi].cosa,edx
mov dx,[esi].lcosa
bswap edx
mov dx,[esi].ldove
mov cx,[esi].posizione
bswap ecx
mov cx,[esi].postrov
mov al,[esi].nvolte
mov [edi].nvolte,al
mov [edi].postrov,cx
bswap ecx
mov [edi].posizione,cx
mov [edi].ldove,dx
bswap edx
mov [edi].lcosa,dx
Assume Esi:Nothing ;------------------------
cmp [edi].cosa,0 ;* Controllo Parametri. *
jne A0001 ;------------------------
A000A: mov errore,1
jmp short A0001
A0001: cmp [edi].dove,0
jne A001A
jmp short A000A
A001A: cmp [edi].posizione,0
jge A001B
mov errore,2
jmp A001I
A001B: xor edx,edx
mov dx,[edi].ldove ;------------------------------
cmp dx,[edi].lcosa ;* Verifica Perdite di tempo! *
jge A001C ;------------------------------
mov errore,3
jmp A001I
A001C: cmp dx,0
jg A001D
push offset routine
push [edi].dove ;---------------------------------
call LenStringa ;* se non sappiamo la dimensione *
mov [edi].ldove,ax ;* la Calcoliamo per dove. *
A001D: cmp [edi].lcosa,0 ;---------------------------------
jg A001E
push offset routine ;---------------------------------
push [edi].cosa ;* se non sappiamo la dimensione *
call LenStringa ;* la calcoliamo per cosa. *
mov [edi].lcosa,ax ;---------------------------------
A001E: cmp [edi].lcosa,1
jg A001F
mov errore,4
jmp A001I
A001F: mov dx,[edi].posizione
add dx,[edi].lcosa
cmp dx,[edi].ldove
jle A001G
mov errore,5
jmp A001I
A001G: mov dx,[edi].lcosa
mov bx,[edi].ldove
mov cx,[edi].posizione
mov luncerca,dx
mov lunsorge,bx
mov poscan,cx
mov edx,[edi].dove
mov ebx,[edi].cosa
mov dove,edx
mov cosa,ebx
A001H: nop
Assume Edi:Nothing ;--------------------------
cmp edx,ebx ;* Evita Stringhe Uguali. *
jne A001I ;--------------------------
mov errore,6
A001I: call Cleareg ;----------------------------
nop ;* Smista Eventuale Errore. *
mov dl,errore ;----------------------------
jmp dword ptr [jmperrore + edx *4]
E0000: mov errore,al
jmp A0012 ;--------------------
E0001:: mov errore,35 ;* Gestione Errori. *
jmp A0012 ;--------------------
E0002:: mov errore,42
jmp A0012
E0003:: mov errore,43
jmp A0012
E0004:: mov errore,101
jmp A0012
E0005:: mov errore,56
jmp A0012
E0006:: mov errore,55
jmp A0012
;==========================================
;* Svolgimento del Compito della Routine. *
;==========================================
A001L:: mov esi,dove
mov edi,cosa
mov cx,poscan
add esi,ecx
mov cx,luncerca ;---
;========================================
;* Ciclo di Scansione Stringa Sorgente. *
;========================================
A0002: xor eax,eax
mov al,byte ptr [edi]
Assume Ebx:ptr Cerca
mov ebx,offset superenalotto
mov [ebx].carattere,al
mov [ebx].dove,esi
mov [ebx].continua,0
mov [ebx].trovato,0
mov [ebx].ultimo,0
mov [ebx].lunghezza,0
mov [ebx].primo,0
mov ax,poscan
mov [ebx].posini,ax
Assume Ebx:Nothing
xor ebx,ebx
xor edx,edx ;-------------------------------
xor eax,eax ;* Cerca il singolo Carattere. *
push offset routine ;-------------------------------
push offset superenalotto
call Hawkeyes
cmp eax,0
je A0003
jmp E0000 ;-----------------------
A0003: xor eax,eax ;* Prende i risultati. *
Assume Ebx:ptr Cerca ;-----------------------
mov ebx,offset superenalotto
mov ax,[ebx].primo
bswap eax
mov al,[ebx].trovato
Assume Ebx:nothing ;----------------------
cmp eax,0 ;* Carattere Trovato? *
jne A0004 ;----------------------
jmp A0012
A0004: bswap eax ;------------------------------------
inc ncartrovati ;* Trovato Verifica se e' il primo. *
cmp primapos,0 ;------------------------------------
jne A0005
mov primapos,ax ;-------------
nop ;* Si Primo. *
jmp A0011 ;-------------
A0005: inc posnew
cmp ax,posnew ;------------------------
je A0006 ;* Vedi se Consecutivo. *
jmp A0007 ;------------------------
A0006: xor ebx,ebx
xor edx,edx
mov dl,ncartrovati
mov posnew,ax ;-------------------------
mov bx,luncerca ;* Si vedi se stringa e' *
cmp bx,dx ;* stata tutta Trovata *
je A0007 ;-------------------------
jmp A0008
A0007: mov bx,posnew
inc bx
inc trovate ;-----------------------------------
add bx,luncerca ;* Si Stringa Completa Trovata ora *
cmp bx,lunsorge ;* Verifica se ce ne sono altre. *
jle A0008 ;* Si Continua Ricerca. *
jmp A0011 ;* No Termina Ricerca. *
A0008: mov ncartrovati,0 ;-----------------------------------
mov edi,Arg2
dec edi
A0009: mov poscan,ax
mov bx,poscan
inc ebx
xor edx,edx
mov dl,ncartrovati
add bx,luncerca
sub bx,dx ;------------------------
cmp bx,lunsorge ;* Test Di Fattibilita' *
jle A0010 ;* Si Continua. *
jmp A0011 ;* No Termina. *
A0010: inc poscan ;------------------------
inc edi
jmp A0002
;=============================================
;* Fine Ciclo di Scansione Stringa Sorgente. *
;=============================================
A0011: cmp byte ptr trovate,0
je A0012
mov errore,1
A0012: call Cleareg
Assume Esi:ptr Parametro_Trova_Stringa
mov esi,Arg1 ;------------------------
mov bl, trovate ;* Caricamento *
mov dx,primapos ;* Parametri di Output. *
mov [esi].nvolte,bl ;------------------------
mov [esi].postrov,dx
Assume Esi:Nothing
popa
xor eax,eax
mov al,errore
ret 8
A0013:
Trova_Stringa Endp
End
codice della routine hawkeyes
già testata in altre applicazioni e funziona correttamente
seve a verificare il singolo byte di 2 stringhe
;----------------------------------------------------------------
;* Programma : verifica se un valore è presente nel vettore. *
;* file : hawkeyes.Asm *
;* Data : 25-11-2016 *
;* Scopo : uso generale. *
;* Routine : Hawkeyes. *
;* Libreria : Babele. *
;* Prototipo c++ : extern "C" int __stdcall Hawkeyes( *
;* struct cerca &dato,int &routine); *
;* par. Input : Struttura cerca *
;* ----------------------------------------------------- *
;* Campo | Necessario | Scopo *
;* ----------------------------------------------------- *
;* carattere | Obbligatorio | carattere da trovare. *
;* dove | Obbligatorio | Stringa in cui cercare. *
;* continua | Obbligatorio | = 0 Primo.= 1 Tutti. *
;* trovato | non riempire | *
;* ultimo | non riempire | *
;* lunghezza | obbligatorio | Lunghezza stringa. *
;* primo | non riempire | *
;* posini | Facoltativo | posizione di partenza. *
;* ----------------------------------------------------- *
;* par. Output : campi non riempiti struttura cerca. *
;* Note : includere il file include\cerca.sam *
;* Errori Gestiti : *
;* ============================================ *
;* 00 | Nessun Errore. *
;* 42 | Parametro non Valido. *
;* 53 | Parametro Fuori Range. *
;* XX | Errore derivante da SubRoutine. *
;* ============================================ *
;* Byte su Disco : 5.995 Byte in Memoria : 179 Test : Superato. *
;----------------------------------------------------------------
.486
.model flat,stdcall
option casemap:none
.data
routine dd ?
tranquillita dd ?
include e:\classe numerica\test\include\cerca.sam
errore db ?
.code
extern Cleareg@0:proc
Cleareg Equ Cleareg@0
Hawkeyes proc Arg1:dword,Arg2:Dword
pusha
mov eax,offset A0009
mov ebx,offset A0000
sub eax,ebx
mov esi,Arg2
add eax,9
mov byte ptr [esi],al
call Cleareg
A0000: mov errore,0
mov esi,Arg1 ;-----------------------------
cmp esi,0 ;* Verifica Esistenza Input. *
jne A0001 ;-----------------------------
jmp E0000
A0001: Assume Esi:ptr Cerca ;------------------------
mov esi,Arg1 ;* Controllo Parametri. *
cmp [esi].lunghezza,0 ;------------------------
jle E0001
mov dx,[esi].posini
cmp dx,[esi].lunghezza
jge E0002
mov dx,[esi].lunghezza
cmp [esi].continua,1
jg E0001
jmp short A0002
E0000: mov errore,al
jmp short A0007
E0001: mov errore,42 ;--------------------
jmp short A0006 ;* Gestione Errori. *
E0002: mov errore,53 ;--------------------
jmp short A0006
A0002: mov [esi].trovato,0
mov [esi].primo,0
mov [esi].ultimo,0
mov edi,[esi].dove
mov cx,[esi].lunghezza ;----------------------
mov dx,[esi].posini ;* Ricerca Carattere. *
add edi,edx ;----------------------
mov ebx,edi
mov tranquillita,edi
mov dl,[esi].carattere ;----------------------
A0003: cmp byte ptr [edi],dl ;* Carattere Trovato. *
jne A0007 ;----------------------
inc [esi].trovato
mov ebx,edi ;----------------------------
sub ebx,tranquillita ;* Calcola offset Elemento. *
A0004: cmp [esi].trovato,1 ;----------------------------
je A0005
mov [esi].ultimo,bx
jmp short A0006
A0005: mov [esi].primo,bx ;--------------------
A0006: cmp [esi].continua,1 ;* Devo continuare? *
je A0007 ;* Si! *
xor ecx,ecx ;* no! *
A0007: inc edi ;--------------------
jecxz A0008
dec ecx
jmp A0003
A0008: Assume Esi:nothing
popa
xor eax,eax
mov al,errore
ret 8
A0009:
Hawkeyes Endp
End
ultimo modulo LenStringa
già testata in altre applicazioni e funziona correttamente
;---------------------------------------------------------------
;* Programma : Calcola la Dimensione di una Stringa. *
;* File : LenStringa.Asm *
;* Data : 04-12-2012 *
;* Scopo : Uso Generale. *
;* Routine : LenStringa. *
;* Libreria : Babele. *
;* Prototipo c++ : extern "C" int __stdcall LenStringa *
;* ( char *stringa,int &dime); *
;* Par. Input : Stringa. *
;* Par. Output : Eax = Dimensione Stringa. *
;* Note : Registro Esi e' Viene Preservato. *
;* Errori Gestiti : Nessuno. *
;* Byte su Disco : 1.807 Byte in Memoria : 22 Test : Superato *
;---------------------------------------------------------------
.486
.model flat, stdcall
option casemap:none
.code
LenStringa PROC Arg1:Dword, Arg2:Dword
mov ebx,offset A0003
mov eax,offset A0000
sub ebx,eax
mov eax,Arg2
mov byte ptr [eax],bl
A0000: push esi
mov esi,Arg1
xor eax,eax
A0001: mov dl,byte ptr [esi]
cmp dl,0
je A0002
inc esi
inc eax
jmp short A0001
A0002: pop esi
ret 8
A0003:
LenStringa endp
end