2016-05-18 12 views
0

Ich lehre derzeit selbst Assembler-Sprache durch den Aufbau eines Assembler für den Arduino Uno. Ich habe jedoch Probleme mit der Umwandlung von RJMP in Binärdateien.AVR-Assembly: binäre Darstellung von RJMP erstellen

Aus den amtel Dokumenten, RJMP wird binär dargestellt als 1100 kkkk kkkk kkkk wo k die relative Adresse zu springen.

Montage des folgenden Code:

check_press_loop: 
    sbis PIND, 2 
    rjmp check_press_loop 

und Demontage erhalte ich:

10: fe cf   rjmp .-4   ; 0xe 

Ich verstehe, warum die relative Sprung -4 Bytes ist, was ich nicht verstehe, ist, wie dies dargestellt ist, durch das Hex fc ef. Das Vertauschen der Reihenfolge aufgrund der Bytereihenfolge "Little Endian" (cf fe) ergibt einen Binärwert von 0b1100111111111110. Entfernen der Anweisung (1100) Teil des Binärwerts, wie steht 111111111110 für -4?

Antwort

2

Hoffentlich wissen Sie, dass 111111111110 -2 ist, wenn sie als Vorzeichen mit zwei Vorzeichen interpretiert wird. Der Grund, warum -2 hier verwendet wird, ist, weil check_press_loop zwei 16-Bit-Wörter vom Ende der RJMP-Anweisung zurück ist. Da AVR-Befehle immer wortorientiert sind, gibt es keinen Grund, dass ein RJMP-Befehl in der Lage ist, einen in Bytes gemessenen Sprungversatz zu codieren. Der Prozessor kann keine Anweisung an einer ungeraden Byte-Adresse im Programmspeicher ausführen, das PC-Register ist nicht in der Lage, eine solche Adresse zu halten.

+0

Brilliant sind. Vielen Dank für die Erklärung. Ja, ich hatte das Zweierkomplement als -2 berechnet, wurde aber vom Disassembler-Wert von -4 geworfen! – soarjay

-1

Versuchen Sie, 0x1234 zu springen :), um zu sehen, wo die Nibbles

+1

Dies ist mehr ein Kommentar als eine Antwort, kopieren Sie es als Kommentar, dann löschen Sie diese Antwort (und Sie werden Ihre verlorene Reputation zurückbekommen!). –

Verwandte Themen