2009-11-20 4 views
1

En prenant mon premier cours en langage assembleur, je suis frustré avec des messages d'erreur cryptiques pendant le débogage ... Je reconnais que les informations suivantes ne suffiront pas à trouver la cause du problème (donné ma compréhension limitée de la langue d'assemblage, ColdFire (MCF5307, famille M68K)), mais je serai heureux de prendre conseil.Adresse Erreur dans l'assemblage (ColdFire MCF5307)

...

JSR out_string

Adresse erreur (format 0x04 vecteur état de défaut de 0x03 0x1 état reg 0x2700)

Je trouve une question similaire sur http://forums.freescale.com/freescale/board/message?board.id=CFCOMM&thread.id=271, en ce qui concerne le ADRESSE ERREUR en général.

La réponse à la question indique que l'erreur d'adresse est due au fait que le code essaie "incorrectement" d'exécuter sur une limite non alignée (ou d'accéder à une mémoire non alignée).

Mes questions seront:

  1. Qu'est-ce que cela signifie pour « tort » d'essayer d'exécuter une limite/mémoire non alignés? S'il y a un exemple, cela aiderait beaucoup

  2. Qu'est-ce qu'une limite/mémoire non-alignée?

  3. Comment (en utilisant des points d'arrêt et trace par exemple.)

Répondre

2

Tout d'abord, il est possible que ce ne soit pas l'instruction à l'origine de l'erreur. Assurez-vous de voir si l'instruction précédente ou suivante pourrait l'avoir causée. Toutefois, en supposant que les gestionnaires d'exceptions et les débogueurs ont amélioré:

An alignment exception est ce qui se produit lorsque, par exemple, des données de 32 bits (4 octets) sont extraites d'une adresse qui n'est pas un multiple de 4 octets.Par exemple, la variable x est de 32 bits à l'adresse 2, puis

const1: dc.w someconstant 
x:  dc.l someotherconstant 

Ensuite, l'instruction

  mov.l x, %r0 

provoquerait un défaut d'alignement de données sur un 68000 (et 68010, IIRC). Le 68020 a éliminé cette restriction et effectue l'accès non aligné, mais au prix d'une baisse des performances. Je ne suis pas au courant de la jsr (saut au sous-programme) instruction nécessitant l'alignement, mais il est pas déraisonnable et il est facile d'organiser, avant chaque fonction, insérez la macro du langage assembleur pour l'alignement:

 .align long 
func: ... 
2

aborderez-vous régler ce problème, supposant que vous avez peu de technique de débogage Il a été longtemps depuis que je l'ai utilisé un processeur de la famille 68K, mais je peux vous donner quelques indices. Essayer de s'exécuter sur une frontière non alignée signifie exécuter du code à une adresse impaire. Si out_string était à une adresse avec le bit bas défini par exemple.

La même chose est vraie pour un accès à la mémoire de données de 2 ou 4 octets. Je ne suis pas sûr si le Coldfire soutient l'accès d'octet aux adresses de mémoire impaires, mais les autres membres de la famille 68K ont fait.

L'erreur d'adresse se produit sur l'instruction qui provoque l'erreur dans tous les cas.

Découvrez les instructions disponibles. Si le pc correspond (ou est proche), alors il s'agit d'une exécution non alignée. S'il s'agit d'un accès à la mémoire, par ex. move.w d0, (a0), puis vérifiez pour voir quelle adresse est en cours de lecture/écriture, dans ce cas, celle pointée par a0.

Je voulais juste ajouter que c'est une très bonne chose à comprendre. Je programme des appareils d'imagerie médicale haut de gamme dans mon travail de jour, mais parfois je dois descendre à ce niveau. J'ai trouvé et réparé plus d'un problème de système d'exploitation COTS en étant capable de dépister juste ce genre de problème.

+0

Si tel est l'hexagone adresse de out_string, alors c'est une adresse impaire, le 1 à la fin est définitivement impair. Vous avez besoin du .align devant le symbole out_string comme l'autre gars l'a mentionné. –

+0

merci beaucoup pour votre message; J'ai résolu le problème –

Questions connexes