Erreur de compilation [Résolu]

Signaler
Messages postés
6
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 janvier 2007
-
Messages postés
6
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 janvier 2007
-
Bonjour  
 
Voila je débute en asm et j'ai donc esayer de realiser une horloge en m'inspirant d'une deja existante mais lors de la compilation j'ai des erreurs que je ne comprend pas os : winXP home sp2

l'erreur :
hor.asm(134) : error A2004: symbol type conflict

la ligne 134 :   mov  ax,@code  
la ligne 135 :   mov  ds,ax

.code
IntVectOFF  dw 0  
IntVectSEG dw 0  
intvectdd dd 0  
Ticks  db 0  
Seconds  db 0  
Minutes  db 0  
Hours  db 0 
printed  db 0 

Merci d'avance

12 réponses

Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

salut,


Ton problème vient du fait que tu veuilles stocker une adresse (@code)
qui est une donnée 32bits dans un registre (ax) qui fait 16bits .. ça
ne rentre pas et c'est logique. Je pense que l'exemple que tu as
récupéré (et dont tu t'es inspiré) est du code 16bits pour processeurs
8086 (avec des adresses en 16bits, ce qui n'est pas le cas des PC) ...


Pour windows XP, il faut te tourner vers du code 32bits.


Chris.

Gentoo... que du bonheur ...
Messages postés
6
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 janvier 2007

merci de ton aide

je voudrais savoir est-ce qu'en 32bits on peut comme utilisé des registre 16bit et 32 bit a la foi?ou dois-je utilisé que des 32 bits?
Messages postés
6
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 janvier 2007

edit : est-il possible de mettre le .code en 16bit sinon car je ne connais pas la syntaxe 32bits. la je suis vraiment perdu :)
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

salut,


Il n'y a aucun soucis pour utiliser des variables 16 bits dans du code 32bits assembleur.

C'est d'ailleur ce que tu fais en utilisant le registre ax :)

à titre d'information :

AH, AL 8bits (AH poids fort AL poids faible)

AX        16bits

EAX      32bits

RAX      64bits (uniquement en mode 64bits appelé em64t chez intel et amd64 chez amd)


tu as donc à dispo (je ne parlerais pas du mode 64bits qui nécéssitent un OS 64bits)


8 "general purpose registers" 32bits :

EAX, EBX, ECX, EDX, ESI, EDI, EBP et ESP (attention toutefois car EBP
et ESP sont utilisé pour la sauvegarde et l'utilisation de l'adresse de
la pile)


8 registres 16bits :

AX, BX, CX, DX, SI, DI,BP et SP (on remarquera que la version 32bits
est une "E"xtension de ces registres 16bits ... et donc toute modif par
exemple de AX, modifie la partie basse 16bits de EAX)


8 registres 8bits :

AH, AL, BH, BL, CH, CL, DH et DL (là encore, ce sont des sous ensembles de AX,BX,CX et DX)


Tu as ensuite des registres appelés SIMD (Single Instruction Multiple Data) 64bits :

MM0 -> MM7 qui sont 8 registres 64bits qui peuvent être segmentés en
8bits, 16bits, 32bits ou 64bits lors des opérations dessus. Attention
aussi sur le fait que ces registre sont "mappé" sur le pile du
coprocesseur arithmétique ... ce qui implique de les nettoyer à la fin
de leur utilisation avec l'instruction "emms" pour avoir un
environnement FPU sain.


Et si ton CPU prend en charge les extensions SSE, tu as aussi 8 registres 128bits supplémentaires:

XMM0 -> XMM7 qui peuvent être segmentés comme les registres MMX mais
avec le double de capacité et indépendant du coprocesseur arithmétique
cette fois-ci (donc pas de restauration du FPU à faire).


Donc pour conclure, oui, tu peux mixer l'utilisation de registres
8/16/32bits dans ton code (c'est même recommandé quand par exemple tu
manipules une chaine de caractère, tu le fais par octets (8bits) et pas
par 32bits ;) sauf pour recopier plus rapidement par paquets de 4
caractères)


Par contre, garde à l'esprit que dans un registre il faut mettre une
donnée cohérente (ex: une adresse -> EAX ou autre 32bits en mode
32bits , ainsi que une adresse -> RAX ou autre 64bits en mode 64bits)

Gentoo... que du bonheur ...
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

re,


pour ce qui est de "@code", c'est une adresse et elle est stocké sur
32bits .... il n'y a donc aucune possibilité de la stocker dans un
registre 16bits !!

Il te faudra passer par le registre "eax" et la transférer dans "esi"
ou "edi", car "ds" est un selecteur de segment (Data Segment, qui sert
à effectuer un adressage de type [SEGMENT]:[OFFSET]). Donc là où tu
avais "[ds:di]" et  "[ds:si]", j'utiliserai "[edi]" et "[esi]"
directement.... Ceci dit, sans compréhension complète du code, ce ne
sera pas aussi simple à traduire, car "di" ou "si" est un offset, et
doit donc être ajouté à "edi" ou "esi" pour que ce soit correct.


Pour ce qui est de l'utilisation d'un tel type d'adressage je laisserai
la parole à d'autres developpeur asm de ce site qui en savent beaucoup
plus que moi sur ce point (je ne manipule pas les adresses en
SEGMENT:OFFSET, je reste pour ma part avec des registres 32bits portant
des adresses directes bien plus simple).

Gentoo... que du bonheur ...
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
Bonjour ggmomo,


Qu'est ce que tu utilises comme assembleur et quel type de fichier demandes tu en sortie ?

Si tu veux créer un exécutable 16 bits (format passablement obsolète de nos jours) il te faut l'indiquer quelque part.
- dans les déclarations de sections
- lors de la compilation (format objet)
- lors de l'édition des liens

Dans ton cas je pense que la déclaration de la section de code est incomplète.

A+
Messages postés
6
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 janvier 2007

Ben j'essaye en 32 bits :)

Il me met 2 erreurs 

1°) test32.asm(134) : error A2004: symbol type conflict

  mov  eax, @code  
  mov  esi,eax

2°)test32.asm(178) : error A2022: instruction operands must be the same size

        mov     word ptr es:[IntNumber*4 + 0], offset ClockISR

Code en .asm

En tout cas mercide ton aide, j'aurais appris plein de choses :)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
_dune2_ > que ESP soit pointeur de pile, c'est clair car "by design" mais de EBP on fait ce que l'on veut. Qu'il puisse avoir un rôle particulier si on fait une stackframe en début de procédure ou alors gestion d'exception etc... ok mais c'est seulement le choix du programmeur car EBP peut s'employer comme nimporte quel autre registre.

ciao...
BruNews, MVP VC++
Messages postés
6
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 janvier 2007

j'utilise masm comme compilateur et en sortie je lui demande un win32 app.
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011

BruNews > entièrement d'accord avec toi sur l'utilisation de EBP
(sous linux, on fait une copie de ESP avec EBP avant de jouer avec ESP
pendant une sous-routine, mais c'est un usage arbitraire comme tu le
dis). Ce que je voulais surtout souligner (plus que le simple fait que
ESP soit de facto le pointeur de pile) c'est surtout de bien faire
attention aux registres utilisés par les Systèmes d'exploitations pour
des usages particuliers et de bien penser à leurs restaurations.

Ma relecture montre effectivement que je me suis mal exprimé ;)


ggmomo > à priori, si tu demandes une application win32, ce sera du
code 32bits qui sera généré. Il te faut donc réflechir dans ce sens ...


Essai de trouver du code 32bits à titre d'exemple, car tu risques fort,
avec ton code 16bits, de rencontrer d'autres problèmes
d'incompatibilité avec des interruptions, voir des accés sur des
entrées/sorties en espace d'adressage physique non accessible en mode
32bits protégé (je dis ça, car tu parles d'une horloge, et il y a
peut-être des accés "Timer")


Chris.

Gentoo... que du bonheur ...
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
2
>ggmomo

Soit tu fais un fichier 16 bits ; dans ce cas le win32 n'est pas un format de sortie valable
Soit tu fais un exécutable 32 bits pour windows et dans ce cas tu oublies les
mov ax,@code
mov ds,ax
car en mode 32 bits on n'utilises plus les registres de segment (En mode protégé ils définissent les privilèges d'accès).

A+
Messages postés
6
Date d'inscription
mercredi 20 décembre 2006
Statut
Membre
Dernière intervention
15 janvier 2007

encore une question

a votre avis quel devrait etre le format de sortie valable pour le code actuel?