2015-09-15 1 views
0

Je crée un programme très simple en langage assembleur. Pour créer un tableau avec les premiers nombres de fibonacci dedans. Cependant sur les lignes 53 j'essaie d'utiliser MOV bx,WORD PTR [fibonacciArray + 5] et il dit qu'il est déjà défini le fibonacciArray que j'ai pourtant c'est la seule manière que j'ai jamais vue PTR utilisée.PTR dans l'assemblage redéfinit l'objet et ne fonctionnera pas

INCLUDE Irvine32.inc  ;//Includes the Irvine32 library of functions 

.data 
fibonacciArray BYTE 0h,1h,0h,0h,0h,0h,0h   ;only known f(0) = 0 && f(1) = 1 


.code 
    main proc 

MOV eax, 0   ;eax register is zeroed out 
MOV ebx, 0   ;ebx register is zeroed out 

MOV al, fibonacciArray    ;al = 0 
ADD al, [fibonacciArray + 1]  ;al = 1 

XCHG [fibonacciArray + 2], al  ;fibonacciArray now 0,1,1,0,0,0,0 
MOV eax, 0       ;eax register is zeroed out 
ADD al, [fibonacciArray + 1]  ;al = 1 
ADD al,[fibonacciArray + 2]  ;al = 2 

XCHG [fibonacciArray + 3], al  ;fibonacciArray now 0,1,1,2,0,0,0 
MOV eax, 0       ;eax register is zeroed out 
ADD al,[fibonacciArray + 2]  ;al = 1 
ADD al,[fibonacciArray + 3]  ;al = 3 

XCHG [fibonacciArray + 4], al  ;fibonacciArray now 0,1,1,2,3,0,0 
MOV eax, 0       ;eax register is zeroed out 
ADD al,[fibonacciArray + 3]  ;al = 2 
ADD al,[fibonacciArray + 4]  ;al = 5 

XCHG [fibonacciArray + 5], al  ;fibonacciArray now 0,1,1,2,3,5,0 
MOV eax, 0       ;eax register is zeroed out 
ADD al,[fibonacciArray + 4]  ;al = 3 
ADD al,[fibonacciArray + 5]  ;al = 8 

XCHG [fibonacciArray + 6], al  ;fibonacciArray now 0,1,1,2,3,5,8 


MOV bl,[fibonacciArray + 3] 
call DumpRegs  ;prints the register information to the screen 

MOV bh,[fibonacciArray + 4] 
call DumpRegs  ;prints the register information to the screen 

MOV bx,WORD PTR [fibonacciArray + 5] 

call DumpRegs  ;prints the register information to the screen 


exit 
main endp 
end main 

Voici le message d'erreur

1>------ Build started: Project: Project, Configuration: Debug Win32 ------ 
    1>reorder.obj : error LNK2005: [email protected] already defined in fibonacci.obj 
    1>C:\Users\~~~~~~~~~~\Project32\Debug\Project.exe : fatal error LNK1169: one or more multiply defined symbols found 
    ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+6

Ce n'est pas ce que dit l'erreur. Il dit '_main @ 0 déjà défini dans fibonacci.obj'. Ce qui signifie que vous avez défini 'main' deux fois. Une fois dans 'reorder.obj' et une fois dans' fibonacci.obj'. Vous avez probablement voulu seulement avoir le fichier plus tard dans votre projet. –

+0

MERCI! Je n'ai pas travaillé longtemps avec l'assemblée, évidemment. Fonctionne parfaitement maintenant. –

Répondre

0

Comme Ross Ridge a souligné dans son commentaire:

Il dit _main @ 0 déjà défini dans fibonacci.obj. Ce qui signifie que vous avez défini deux fois. Une fois dans reorder.obj et une fois dans fibonacci.obj. Vous avez probablement seulement censé avoir le fichier plus tard dans votre projet

L'erreur de liens que vous avez obtenu était:

1>reorder.obj : error LNK2005: [email protected] already defined in fibonacci.obj 

La façon de lire est que si l'éditeur de liens a été le traitement reorder.obj il a trouvé main était déjà défini dans le fichier fibonacci.obj. Pour des raisons évidentes, vous ne pouvez pas avoir deux étiquettes avec une liaison externe (globale) car l'éditeur de liens n'aurait aucune idée de l'étiquette que vous vouliez utiliser si elle était référencée dans le code.

Il était plus que probable que vous ayez défini par erreur main deux fois - une fois dans chaque fichier.

+0

J'ai marqué ceci comme wiki de communauté puisque la réponse venait de @rossridge et une solution trouvée. Je suis en train de formaliser ce qui a été trouvé dans une réponse sans en tirer profit. –