Question

Mon compilateur ne fonctionne pas avec un fichier de montage je et mon autre compilateur qui ne fonctionnera pas avec les fichiers c que j'ai. Je ne comprends pas l'assemblage. Je dois déplacer ce sur mais je ne suis pas aller nulle part vite. Y at-il quelqu'un là-bas qui peut aider? Je ne peux pas croire qu'il n'y a pas un traducteur disponible. Voici le début du fichier:

    list        p=18F4480       
    #include    <p18F4480.inc> 

    #define _Z      STATUS,2
    #define _C      STATUS,0

    GLOBAL  AARGB0,AARGB1,AARGB2,AARGB3     
    GLOBAL  BARGB0,BARGB1,BARGB2,BARGB3
    GLOBAL  ZARGB0,ZARGB1,ZARGB2
    GLOBAL  REMB0,REMB1
    GLOBAL  TEMP,TEMPB0,TEMPB1,TEMPB2,TEMPB3
    GLOBAL  LOOPCOUNT,AEXP,CARGB2


LSB         equ 0
MSB         equ 7

math_data   UDATA   
AARGB0      RES 1       
AARGB1      RES 1
AARGB2      RES 1
AARGB3      RES 1
BARGB0      RES 1   
BARGB1      RES 1
BARGB2      RES 1
BARGB3      RES 1
REMB0       RES 1   
REMB1       RES 1
REMB2       RES 1
REMB3       RES 1   
TEMP        RES 1
TEMPB0      RES 1
TEMPB1      RES 1
TEMPB2      RES 1
TEMPB3      RES 1
ZARGB0      RES 1
ZARGB1      RES 1
ZARGB2      RES 1
CARGB2      RES 1
AEXP        RES 1
LOOPCOUNT   RES 1


math_code   CODE
;---------------------------------------------------------------------
;       24-BIT ADDITION             
_24_BitAdd
    GLOBAL  _24_BitAdd
    movf    BARGB2,w
    addwf   AARGB2,f

    movf    BARGB1,w
    btfsc   _C
    incfsz  BARGB1,w
    addwf   AARGB1,f

    movf    BARGB0,w
    btfsc   _C
    incfsz  BARGB0,w
    addwf   AARGB0,f
    return

Je reçois que je peux largly Excluez les deux premières lignes que le dispositif définit sont dans mon main.c de toute façon. Les deux #defines sont juste, mais la façon la plus simple (je pense) est juste de remplacer les instances de _Z et _C avec le statut, 2 et STATUS, 0 en conséquence. Les lignes suivantes (les GLOBALS) sont simplement des déclarations de variables je collecte. Même avec LSB et MSB, sauf qu'ils attribuent également des valeurs. La prochaine chunck Je pense que je déclare juste un groupe d'entiers avec ces noms (AARGB0, etc.), puis le chunck après est une fonction.

Je ne me soucie même pas de traduire cette fonction, parce que mon compilateur a # asm / # fin directives asm donc je peux le mettre en raw (tant que son enveloppé dans une fonction).

Je pense que je l'ai tout ... jusqu'à ce que je construis et mon compilateur hurle sur le statut non défini. Et bien sûr, ce ne est pas. Mais qu'est-ce que c'est? J'ai lu sur le net que les registres d'état sont quelque chose de spécial, mais je ne comprends pas comment cela fonctionne.

Si vous avez pas remarqué, je ne suis même pas sûr de ce qu'il est je demande vraiment. Je veux juste la chose sanglante à travailler.

Était-ce utile?

La solution

STATUS est intégré dans le registre dans l'architecture PIC, qui met en œuvre les mêmes fonctionnalités que les drapeaux « statut » ou « condition » enregistrent dans la plupart des CPU plus: s. Il contient bitflags qui sont définies et défrichées par le microcontrôleur comme il exécute le code, vous indiquant le résultat des opérations.

Le drapeau de Z, par exemple, est réglé chaque fois qu'un résultat d'opération arithmétique dans un zéro, et le drapeau C (carry) est réglé lorsque dépassement de capacité arithmétique est détectée.

Ce sont des indicateurs qui ne sont généralement pas visibles de C, comme C ne veut pas exiger que le processeur hôte même a bits d'état, traduisant ainsi directement ce code C sera difficile. Vous aurez besoin de trouver un moyen d'inclure les tests de bits lecture statut dans le code C et utiliser ces instructions lorsque cela est possible. Cela peut être gênant, à partir de C vous avez moins de contrôle sur les registres sont utilisés, ce qui pourrait rendre difficile pour vous assurer que vous vérifiez les drapeaux appropriés au bon endroit (s).

sont quelques liens vers d'autres personnes étendues de la précision du code PIC. La plupart semblent rester dans l'ensemble, mais ils pourraient encore être utiles en tant que références ou inspiration.

Autres conseils

Vos compilateurs refusent la source?

Soit vous utilisez des outils cassés, ou vos fichiers source sont bogués. Dans les deux cas, votre problème n'est pas « ASM à C traduire » ou quelque chose comme ça, mais les bugs dans votre source / toolchain. Ne pas essayer de contourner les problèmes, les résoudre.

Vous pouvez essayer de désosser le démontage. Mais qu'allez-vous apprendre?

Vous devriez être en mesure de compiler votre assemblage (en utilisant le compilateur 1) dans un fichier objet, et que le lien vers le fichier objet compilé par le compilateur 2 à partir de votre fichier C.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top