Реализация RJMP на ассемблере, avr - PullRequest
0 голосов
/ 27 мая 2018

Я делаю свой проект.Это виртуальный процессор, реализованный на языке Си.Проблема в том, что RJMP не хочет работать должным образом.Вот реализация C:

void F_JMP_REL(void){
printf("0x%04X[0x%04X]: JMP PC+0x%04X\n", getPC(), getOpcode(), getOpcode() & 0x0FFF);

if((getOpcode() & 0x0800)==0)
    setPC(getPC()+(getOpcode() & 0x0FFF));
else
    setPC(getPC()-(0x1000-(getOpcode() & 0x0FFF)));

addCounter(1);
}

А вот инструкция на ассемблере:

.text
.global    main
.type    main, @function

main:
ldi r30, 0x00
mov r3, r1
mov r4, r2
rjmp 
ldi r16, 0x00
ldi r16, 0x01
ldi r17, 0x32

Я хочу, чтобы rjmp перешел прямо к первой инструкции в первом случае и, например, для ldi r17, 0x32,IDK почему, но когда я набираю адреса 2K + 1, поэтому K = 1, поэтому в шестнадцатеричном формате это будет 0x001, оно не работает и переходит на 0x07FB.Я пытался $ + 2, но ошибка в компиляторе AVR

...