2017-05-22 2 views
0

Relative jump to an address within PC - 2K +1 and PC + 2K (words). In the assembler, labels are used instead of relative operands. For AVR microcontrollers with program memory not exceeding 4K words (8K bytes) this instruction can address the entire memory from every address location.AVR (ATmega8515) rjmp springt nicht relativ

Basierend auf http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_RJMP.html, der rjmp Befehl sollte relativ das PC-Register ändern. Aber mein Code unten springen, um die genauen Adresse (in diesem Fall zu ldi temp, low(RAMEND) Befehl mit der Adresse 0x00)

.include "m8515def.inc" 

.def temp = r16 


STACK_INIT: 
    ; init stack pointer 
    ldi temp, low(RAMEND) 
    out SPL, temp 
    ldi temp, high(RAMEND) 
    out SPH, temp 

TES: 
    rjmp 0x00 

END: 
    rjmp END 

Ich habe versucht, den rjmp Befehl jmp zu ändern, aber die ATmega8515 nicht unterstützt diesen Befehl

Ich weiß nicht, ob dies wegen der Konfiguration oder etwas. Ich verwende AVR Studio 4 zum Erstellen und Ausführen meines Programms. Kann jemand es erklären?

Antwort

1

Dies wird erwartet. Für die Bequemlichkeit von Assembler-Programmierern verwendet die Operation rjmp eine absolute statt einer relativen Adresse. Die absolute Adresse wird in eine relative Adresse umgewandelt, wenn sie den binären Maschinencode tatsächlich kompiliert, und Sie erhalten einen Fehler, wenn die Adresse zu weit entfernt ist, um dorthin zu springen.

Übrigens können Sie das $-Symbol in Ihren Operanden verwenden. Es ist die Adresse der aktuellen Anweisung. So etwas wie rjmp $+2 würde zu zwei Bytes nach dem nächsten Befehl springen.

+0

Ist dies für alle Assembler oder nur avr spezifisch? Die 'rjmp $ + 2' geben mir' Fehler: Syntaxfehler, unerwartete $ undefined' –

+0

Ich kann keine absoluten Aussagen über alle Assemblersprachen machen. –