2017-10-18 8 views
0

Le programme que je suis en train d'écrire prend la forme d'un nombre à un chiffre suivi d'un espace suivi d'un nombre à deux chiffres. Le programme prendra les deux nombres et les ajoutera ensemble, réduira le nombre par 7 jusqu'à moins de 7, et associera ce nombre à un jour de la semaine. Voici ce que j'ai:Ensemble Motorola 68000 comparant des nombres

start: initIO     * Initialize (required for I/O) 
    setEVT   * Error handling routines 
* initF   * For floating point macros only  

    linein buffer   *reads in values 
    cvta2 buffer,#1  *provided macro to convert ascii to num, read first digit only 
    move.b D0,D1   *Store value in D1 
    cvta2 buffer+2,#2  *read the next two digits after space 
    move.b D0,D2   *store 
    add.b D1,D2   *add them together (I can probably use just one register here) 

est ici le problème:

for: cmp.w week, D2 *<<<<< This is saying invalid syntax, I want to see if the number provided is greater than 7, if not branch out to the next section 

/ennuis

ble done 
    subq.w #7,D2  *If num>7, sub 7 

done: 

    lineout dmsg 

     break     * Terminate execution 
* 
*---------------------------------------------------------------------- 
*  Storage declarations 

buffer: dc.b 80 
dmsg: dc.b 'Done',0 
week: dc.b $7 *If combined value is greater than this, sub 7 
*These are the values to check against to get correct reply 
sun: dc.b $1 
mon: dc.b $2 
tues: dc.b $3 
weds: dc.b $4 
thurs: dc.b $5 
fri: dc.b $6 
sat: dc.b $7 
*These are the responses for the output 
sunr: dc.b 'Sunday',0 
monr: dc.b 'Monday',0 
tuesr: dc.b 'Tueday',0 
wedsr: dc.b 'Wednesday',0 
thursr: dc.b 'Thursday',0 
frir: dc.b 'Friday',0 
satr: dc.b 'Saturday',0 

     end 

Il y aura plus de code quand je savoir comment faire la comparaison ci-dessus, mais ce sera le même type de comparaison en utilisant simplement le résultat par rapport aux valeurs des jours de la semaine afin de fournir la réponse correcte.

J'ai essayé d'utiliser les différentes formes de cmp (cmpa, cmpi.w/l, etc), mais je n'arrive pas à trouver une méthode qui me permette de comparer les deux valeurs. Est-ce que je devrais charger la valeur que j'ai marquée "semaine" dans un registre avant d'essayer de le comparer ou quelque chose comme ça?

Des exemples de I/O:

entrée:

sortie:

"mercredi"

Toute idée est appréciée. Merci pour votre temps.

+0

Veuillez ne pas modifier la réponse à la question; Postez-le comme une réponse. (et annuler votre modification.) –

+0

Même si le code de problème est toujours là et séparé du code de travail? Peut faire. –

+0

Oui, répondre à la question dans la question va à l'encontre du format Q & A, et met votre propre réponse dans un endroit spécial au-dessus des autres où le vote ne peut pas trouver les meilleures réponses au sommet. (Peu importe les questions de déboguage, car elles ont rarement une grande valeur future, il est difficile pour d'autres personnes de chercher et de trouver la bonne question quand elles ne savent pas quel est leur problème.) Quoi qu'il en soit, merci de ranger votre question. , et bienvenue dans Stack Overflow. –

Répondre

0

Vous essayez d'effectuer une comparaison avec un mode d'adressage non pris en charge (dans votre exemple, l'opérande 'semaine' n'est pas une valeur immédiate, mais une adresse mémoire).

Pour comparer D2 avec 7 vous pouvez utiliser cmpi (comparer immédiatement):

cmpi.b #7,d2 

Dans le cas où vous avez besoin de l'opérande à une variable, vous devez le charger dans un registre premier:

lea week,a0 
... 
cmp.b (a0),d2 

assurez-vous également que la taille d'opérande dans l'instruction cmp correspond à la taille de vos données

+0

Ceci charge l'adresse de l'étiquette dans a0, donc je pense que j'ai juste besoin de trouver la syntaxe correcte pour charger la valeur à cette adresse et je devrais être bon. –

+0

@JeremyH. Vous n'avez pas réellement besoin de 'week' pour changer au moment de l'exécution, donc au lieu de le stocker en mémoire, définissez-le comme une constante assembleur. (J'oublie la syntaxe de m68k, mais quelque chose comme "semaine equ 7" donc quand vous écrivez 'cmpi.w semaine, d2' c'est l'équivalent d'écrire' cmpi.w # 7, d2' –

+0

@JeremyH .: Et BTW, adressage m68k modes: http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/addmode.html Il existe des modes d'adressage absolus (et relatif à PC), peut-être que votre assembleur se plaint parce que l'étiquette 'week' est suivi par un 'dc.b' mais vous faites un chargement de mots? –

0

Modifier (code de travail pour problème avec la mise en garde qu'il ne soit pas optimisé) :

start: initIO     * Initialize (required for I/O) 
    setEVT   * Error handling routines 
* initF   * For floating point macros only  

    linein buffer 
    cvta2 buffer,#1 
    move.l D0,D1 
    cvta2 buffer+2,#2 
    move.l D0,D2 
    add.l D1,D2  

    divu.w #$0007,D2 

    lsr.l #$08,D2 *Shift remainder 
    lsr.l #$08,D2  

    move.w sun,A2 
    cmp.w A2,D2 
    BNE monday 
    lineout sunr 
    BEQ end 

monday: 
    move.w mon,A2 
    cmp.w A2,D2 
    BNE tuesda 
    lineout monr 
    BEQ end  

tuesda: 
    move.w tues,A2 
    cmp.w A2,D2 
    BNE wednes 
    lineout tuesr 
    BEQ end  

wednes: 
    move.w weds,A2 
    cmp.w A2,D2 
    BNE thursd 
    lineout wedsr 
    BEQ end  

thursd: 
    move.w thurs,A2 
    cmp.w A2,D2 
    BNE friday 
    lineout thursr 
    BEQ end  

friday: 
    move.w fri,A2 
    cmp.w A2,D2 
    BNE saturd 
    lineout frir 
    BEQ end  

saturd: 
    lineout satr 
    BEQ end  

end:  
     break     * Terminate execution 
* 
*---------------------------------------------------------------------- 
*  Storage declarations 

buffer: dc.b 80 
wkmsg: dc.w 'The day of the week is ' 
week: equ $7 
sun: dc.w $1 
mon: dc.w $2 
tues: dc.w $3 
weds: dc.w $4 
thurs: dc.w $5 
fri: dc.w $6 
sat: dc.w $7 
sunr: dc.w 'Sunday',0 
monr: dc.w 'Monday',0 
tuesr: dc.w 'Tueday',0 
wedsr: dc.w 'Wednesday',0 
thursr: dc.w 'Thursday',0 
frir: dc.w 'Friday',0 
satr: dc.w 'Saturday',0 

     end 
+0

'BEQ end' est une branche conditionnelle, non? Sûrement, il devrait être un saut inconditionnel, au lieu de conditionnel sur les drapeaux laissés par 'lineout'. –

+0

Vous savez déjà que ce n'est pas optimisé, mais le plus grand qui me saute aux yeux est que vous pourriez faire une vérification des bornes, puis une recherche de table à partir d'une table de pointeurs vers des chaînes. Donc, au lieu de '$ 1',' $ 2', etc. en mémoire, vous auriez 'dc.w $ sunr, $ monr, ...' (ou quelle que soit la bonne syntaxe pour avoir l'adresse d'une autre étiquette en tant que donnée), donc vous faites une charge indexée dans A2 ou quelque chose, puis 'lineout A2'. –

+0

En outre, vous n'avez vraiment pas besoin de '$ 1' pour être stocké dans un' dc.w'. Les constantes 1-7 pourraient également être des constantes 'equ'. Aussi, je pense que vous avez oublié le ', 0' après' wkmsg', mais si le nombre de caractères est impair, alors utiliser 'dc.w' vous a sauvé de vous-même en remplissant avec un zéro sur un nombre entier de mots. –