ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
9 сентября
1603318 Топик полностью
aбвгдe (Сегодня, 15:50, просмотров: 4) ответил mse homjak на Вот такое работает нормально
Это не то, нужен auto_jmp.inc, нарылся в сети файлик, предположительно работающий с auto_jmp.inc 
/*
 * auto_jmp_tst.asm
 *
 * Поверхностные регрессионные тесты для auto_jmp.inc (auto_br, auto_brb, auto_jc
 * и построенных на них #define'ов). Каждый блок проверяет, что выбор схемы
 * перехода (короткий условный / rjmp+пропуск / jmp+пропуск, либо rjmp/jmp
 * напрямую для auto_jc) переключается ровно на границе диапазона.
 *
 * Как проверять: собрать этот файл, открыть .lss/.map и убедиться, что
 * реальные машинные слова соответствуют комментариям (или спросить
 * Клода - он умеет разбирать сгенерированный .hex побайтово и проверять
 * правильность цели перехода).
 */

.include "m2561def.inc"
.include "auto_jmp.inc"
.LISTMAC

.org 0x0000
RESET:
    ldi r16, 0x01
    tst r16

    ; ============================================================
    ; ЧАСТЬ 2. auto_brb / BRIE_,BRID_ - близко/далеко, чтобы убедиться, что
    ; генерализация на бит флага не сломала логику диапазонов.
    ; ============================================================
	.set	shift	= 0x30
part3_back_close:
	.org	PC + shift
    BRCS_(part3_back_close)
    BRCS_(part3_fwd_close)
	.org	PC + shift
part3_fwd_close:

	.set	shift	= 0x3000
part3_back_far:
	.org	PC + shift
    BRCS_(part3_back_far)
    BRCS_(part3_fwd_far)
	.org	PC + shift
part3_fwd_far:

    ; ============================================================
    ; ЧАСТЬ 3. auto_brb / BRBS_,BRBC_ (произвольный флаг через BRBS/BRBC
    ; с явным номером бита) - близко/далеко, чтобы убедиться, что
    ; генерализация на бит флага не сломала логику диапазонов.
    ; Бит 0 = флаг Carry (то же самое, что BRCS/BRCC, но через BRBS/BRBC).
    ; ============================================================
	.set	shift	= 0x30
part3_back_close:
	.org	PC + shift
    BRBS_(0, part3_back_close)
    BRBS_(0, part3_fwd_close)
	.org	PC + shift
part3_fwd_close:

	.set	shift	= 0x3000
part3_back_far:
	.org	PC + shift
    BRBS_(0, part3_back_far)
    BRBS_(0, part3_fwd_far)
	.org	PC + shift
part3_fwd_far:

    ; ============================================================
    ; ЧАСТЬ 4. auto_jc / JMP_,CALL_ - здесь была найдена и исправлена
    ; реальная ошибка (неверное смещение k2 вместо k1 - "лишний -1",
    ; т.к. rjmp/rcall тут САМИ стоят первым словом, без предшествующего
    ; пропуска). Границы: k(rjmp/rcall) valid: -2048..2047.
    ; ============================================================

    ; --- JMP_, вперёд ---
    ; k = 2047 (валидно) -> rjmp
    JMP_(part4_fwd_e1_in)
	.org	PC + 2047
part4_fwd_e1_in:

    ; k = 2048 (не валидно) -> jmp
    JMP_(part4_fwd_e1_out)
	.org	PC + 2048
part4_fwd_e1_out:

    ; --- JMP_, назад ---
part4_back_e1_in:
	.org	PC + 2047
    ; k = -2048 (валидно) -> rjmp
    JMP_(part4_back_e1_in)

part4_back_e1_out:
	.org	PC + 2048
    ; k = -2049 (не валидно) -> jmp
    JMP_(part4_back_e1_out)

    ; --- CALL_, беглая проверка (та же логика auto_jc, другая пара мнемоник) ---
part4_call_target:
	.org	PC + 100
    CALL_(part4_call_target)

    ; ============================================================
    ; ДЕМОНСТРАЦИЯ dauto_jmp: метка "loop" объявлена ВНУТРИ макроса
    ; count_down_loop_demo, но переход через auto_jmp всё равно
    ; работает корректно при многократных вызовах подряд.
    ; ============================================================
    .MACRO count_down_loop_demo
        ldi r16, @0
    loop:
        dec r16
        BRNE_(loop)
    .ENDMACRO

    count_down_loop_demo 5
    count_down_loop_demo 10
    count_down_loop_demo 20

    nop
rjmp	PC + 1
jmp		RESET