2017-10-18 5 views
0

Das Programm, das ich gerade schreibe, nimmt die Eingabe in Form einer einstelligen Zahl gefolgt von einem Leerzeichen, gefolgt von einer zweistelligen Zahl. Das Programm nimmt die zwei Zahlen und fügt sie zusammen, reduziert die Anzahl um 7 Sekunden auf weniger als 7 und verknüpft diese Zahl mit einem Wochentag. Hier ist, was ich habe:Motorola 68000 Assembly Vergleichen von Zahlen

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) 

hier ist das Problem:

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 

/Ärger

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 

Es wird mehr Code, wenn ich herausfinden, wie der Vergleich oben zu machen, aber es wird die gleiche Art von Vergleich sein, nur das Ergebnis gegen die Werte der Wochentage verwendend, um die korrekte Antwort zur Verfügung zu stellen.

Ich habe versucht, die verschiedenen Formen von cmp (cmpa, cmpi.w/l, etc) zu verwenden, aber ich kann nicht scheinen, eine Methode zu finden, die mir erlaubt, die zwei Werte zu vergleichen. Müsste ich den Wert "Woche" in ein Register laden, bevor ich versuche, es zu vergleichen?

Beispiele für I/O:

Input:

Output:

"Mittwoch"

Jeder Einblick wird geschätzt. Vielen Dank für Ihre Zeit.

+0

Bitte bearbeiten Sie nicht die Antwort in der Frage; poste es als Antwort. (und die Bearbeitung rückgängig machen.) –

+0

Auch wenn der Problemcode immer noch vorhanden ist und vom Arbeitscode getrennt ist? Tun können. –

+0

Ja, das Beantworten der Frage in der Frage besiegt das Q & A-Format und bringt Ihre eigene Antwort an einen besonderen Ort über anderen, wo das Abstimmen nicht die besten Antworten auf die Spitze bringen kann. (Kaum relevant für Debug-Hilfe-Fragen, da sie leider selten viel Zukunftswert haben; es ist schwer für andere Leute, die richtige Frage zu finden und zu finden, wenn sie nicht wissen, was ihr Problem ist.) Wie auch immer, danke für deine Frage und willkommen bei Stack Overflow. –

Antwort

0

Sie versuchen, einen Vergleich mit einem nicht unterstützten Adressierungsmodus durchzuführen (in Ihrem Beispiel ist der Operand "Woche" kein Sofortwert, sondern eine Speicheradresse).

Zum Vergleich D2 mit 7 können Sie cmpi (vergleiche sofort) verwenden:

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

cmpi.b #7,d2 

Falls Sie die Operanden benötigen eine Variable zu sein, können Sie es in ein Register zuerst geladen werden muss

auch die Operandengröße in der cmp Befehl stellen sie sicher, passt die Größe Ihrer Daten

+0

Dies ist das Laden der Adresse des Labels in a0, also denke ich, ich muss nur die richtige Syntax herausfinden, um den Wert an dieser Adresse zu laden, und ich sollte gut sein. –

+0

@ JeremyH. Sie brauchen zur Laufzeit nicht 'week', um sie zu ändern. Anstatt sie im Speicher zu speichern, definieren Sie sie als Assembler-Konstante. (Ich vergesse m68k Syntax, aber etwas wie 'week equ 7' also, wenn Sie' cmpi.w Woche schreiben, d2' es entspricht dem Schreiben 'cmpi.w # 7, d2'. –

+0

@ JeremyH .: Und BTW, m68k Adressierung Modi: http://moss.csc.ncsu.edu/~mueller/codeopt/codeopt00/notes/addmode.html Es gibt absolute (und PC-relative) Adressierungsmodi, vielleicht beschweren sich Ihre Assembler wegen des 'week' Labels wird gefolgt von einem 'dc.b', aber du machst ein Wort laden? –

0

Edit (Arbeits Code für Problem mit dem Vorbehalt, dass es nicht optimiert ist) :

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 Ende' ist eine bedingte Verzweigung, richtig? Sicherlich sollte es ein unbedingter Sprung sein, anstatt an die Flags von 'lineout' gebunden zu sein. –

+0

Sie wissen bereits, dass dies nicht optimiert ist, aber die größte, die bei mir herausspringt, ist, dass Sie eine Begrenzungsüberprüfung und dann eine Tabellensuche aus einer Tabelle von Zeigern auf Zeichenfolgen durchführen können. Statt "$ 1", "$ 2" usw. im Speicher hätten Sie also "dc.w $ sunr, $ monr, ..." (oder die richtige Syntax, um die Adresse eines anderen Labels als Daten zu haben), also machen Sie eine indizierte Ladung in A2 oder etwas, dann 'lineout A2'. –

+0

Außerdem brauchen Sie wirklich nicht $ 1, um in einem 'dc.w' gespeichert zu werden. Die 1-7 Konstanten könnten auch 'äqu'-Konstanten sein. Ich glaube, du hast die ', 0' nach' wkmsg' vergessen, aber wenn die Anzahl der Zeichen ungerade ist, dann hat dich'dc.w' gerettet, indem du mit einer Null auf eine ganze Anzahl von Wörtern aufgefüllt hast. –

Verwandte Themen