Error LNK2019

di il
6 risposte

Error LNK2019

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.

6 Risposte

  • Re: Error LNK2019

    In questo caso, il sorgente ASM dovrà seguire la convenzione C e quindi dovrai scrivere

    .model flat, stdcall, C
  • Re: Error LNK2019

    Allora ogni gruppo codice è un file a se stante
    e poi c'è il file con il programma c++
    dove c'è la definizione delle tre funzioni
    extern "C" int __stdcall lentstringa(char *);
    extern "C" int __stdcall seachar(char *,char,int,int);
    extern "C" void __stdcall cleareg();
    spero che ti bastino come informazioni
    altrimenti quando torno a casa ti metto l'intero programma
  • Re: Error LNK2019

    Sì ... non è più importante ... rileggi la mia risposta precedente.
  • Re: Error LNK2019

    Ho provato a cambiare la .model flat, stdcall in .model flat, stdcall, c
    ma mi da ancora lo stesso errore
    sotto ti inserisco una parte del codice c++ forse ti può essere d' aiuto.
    #include "stdafx.h"
    #include "iostream"
    using std::cin;
    using std::cout;
    using std::endl;
    extern "C" int __stdcall seachar(char *,char,int,int);
    extern "C" int __stdcall lenstringa(char *);
    extern "C" void __stdcall cleareg();
    int _tmain(int argc, _TCHAR* argv[])
    {
    	char pippo[50];
    	int posizione,errore,nbyte,lstringa;
    	char car;
  • Re: Error LNK2019

    Okay ... se ti è necessaria la modalità _sdtcall allora devi chiamare le funzioni usando la decorazione appropriata, ovvero

    cleareg@0
    lenstring@4

    magari usando una EQU

    Il numero che segue è l'occupazione dei parametri

    Ovviamente elimina la clausola C che ti avevo suggerito.

    Puoi sempre usare lo standard cdecl ed evitare tutti questi problemi.
  • Re: Error LNK2019

    Grazie
    sto sperimentando i vari metodi di passaggio di parametri e questo era il primo.
    adesso sperimento _cdecl e poi _fastcall
    per il metodo _this... non è ancora il momento visto che non uso ancora gli oggetti.
Devi accedere o registrarti per scrivere nel forum
6 risposte