Salve a tutti
ho fatto un semplice programmino in c++ con visual studio 2012
che richiama 3 routine assembler
adesso il problema sta che nel modulo principale assembly quando chiamo le altre 2 funzioni assembly queste utime ritornano il fatidico errore
error LNK2019: riferimento al simbolo esterno _lenstringa non risolto nella funzione _seachar@16
error LNK2019: riferimento al simbolo esterno _cleareg non risolto nella funzione _seachar@16
le due funzioni sono state inserite nel progetto maalmeno per il momento on devono far pate di alcuna libreria.
le 3 funzioni sono le sguenti :
.486
.model flat,stdcall
option casemap :none
.code
cleareg proc near
xor eax,eax
xor ebx,ebx
xor ecx,ecx
xor edx,edx
xor edi,edi
xor esi,esi
ret
cleareg endp
end
.486
.model flat, stdcall
option casemap :none
.code
lenstringa PROC Arg1:DWORD
mov esi,Arg1
xor eax,eax
ciclo:
cmp byte ptr [esi],0
je fineciclo
inc esi
inc eax
jmp short ciclo
fineciclo:
ret
lenstringa endp
end
sotto c'è il moduo assembly principale
.486
.model flat, stdcall
option casemap :none
; option prologue :none bisogna ancora capire come effettuare la corretta visione dei parametri.
; option epilogue :none bisogna ancora capire come modificare correttamente i parametri.
.data
carattere db ?
inistr dd ? ; puntatore alla stringa da esaminare
posizione db ?
errore db ?
lstringa db ?
addinizio dd ?
;addfine dd ?
.code
extern lenstringa:proc
extern cleareg:near
;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
;º parametri della funzione : º
;º Arg1 = stringa in cui cercare. Arg2 = carattere da ricercare. º
;º Arg3 = posizione d' inizio. º
;º Arg4 = risultato funzione. º
;º 0 = trovato Arg3 conterra' la posizione del carattere. º
;º 1 = non trovato. º
;º 2 = parametri non corretti. º
;º eax = totale byte occupati in memoria dalla routine. º
;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
seachar PROC Arg1:DWORD,Arg2:DWORD,Arg3:DWord,Arg4:DWord
inizio:
call cleareg
mov ebp,esp
push ebp
mov edx,Arg4 ; errore da ritornare
mov eax,Arg3 ; carattere da ricercare
mov ebx,Arg2 ; posizione di partenza
mov esi,Arg1 ; puntatore stringa da esaminare
mov byte ptr errore,dl
mov byte ptr carattere,al
mov byte ptr posizione,bl
mov inistr,esi
push esi
call lenstringa
mov byte ptr lstringa,al
mov eax,inizio ; prende la locazione di inizio del programma
mov dword ptr addinizio,eax
call cleareg
;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
;º controllo parametri. º
;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
cmp byte ptr carattere,0
je imposta_errore
cmp byte ptr errore,0
jne imposta_errore
xor eax,eax
mov al,posizione
cmp al,lstringa
jg imposta_errore
cmp ax,0
jl imposta_errore
jmp operazione
imposta_errore:
mov word ptr errore,2
jmp fine_programma
;ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
;º inizio operazioni. º
;ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ
operazione:
call cleareg
mov byte ptr errore,0
mov esi,inistr
mov dl,posizione
add esi,edx
mov cl,lstringa
mov al,carattere
push ecx
ciclo:
mov bl,[esi]
cmp byte ptr [esi],al
je trovato
inc esi
inc edi
rip_ciclo:
loop ciclo
pop ecx
cmp ebx,0
jne ok
inc word ptr errore
jmp fine_programma
trovato:
mov ebx,1
xor ecx,ecx
inc ecx
jmp rip_ciclo
ok:
mov ebx,edi
mov posizione,bl
fine_programma:
mov al,posizione
mov bl,errore
mov dword ptr Arg3,eax
mov dword ptr Arg4,ebx
mov eax,fine
mov ebx,addinizio
add eax,3
sub eax,ebx
mov ebx,offset carattere
mov ecx,offset addinizio
add ecx,4
sub ecx,ebx
add eax,ecx
pop ebp
mov esp,ebp
fine:
ret ;20
seachar endp ;problema da risolvere non restituisce le variabili modificate
end
premetto che se richiamo le 2 funzioni incriminate e cioè cleareg e lenstringa dalmodulo c++ esse funzionano correttamente.
confido in qualche anima pia che mi spieghi l'errore e naturalmente come risolverlo.