Итак, теперь более корректная функция:
Код: Выделить всё
.macro cpsli; формат: cpsli ramaddr, const
ldi YL, low(@0) ; загружаем адрес сравниваемой переменной
ldi YH, high(@0)
rcall compare ; вызываем функцию сравнения.
.db @1&0xFF, (@1>>8)&0xFF, (@1>>16)&0xFF, @1>>24 ; Это второй параметр-константа функции сравнения
.endm
.Equ SER0=0xCC
.Equ SER1=0x87
.Equ SER2=0x7F
.Equ BUT=0x9B
.dseg
buffer: .byte 4
; ...
.cseg
; ...
; Где-то в основной программе
cpsli buffer, (SER0<<24) | (SER1<<16) | (SER2<<8) | BUT
breq on_led ; Если числа равны, то включаем светодиод
; ...
; где-то ниже
; функция сравнения 4-байтного числа
; в Y хранится адрес сравниваемого числа в ОЗУ
compare:
pop ZH ; грузим адрес константы во FLASH
pop ZL
adiw Z, 2 ; перепрыгиваем через 2 байта
push ZL ; грузим адрес слудующей команды
push ZH
sbiw Z, 2
adiw Y, 4
lsl ZL ;; Переходим от слов к байтам
rol ZH
rcall compareByte2 ; сравниваем 4 байта
compareByte2:
rcall compareByte
compareByte:
ld R0, -Y
lpm R1, Z+
cpc R0, R1
ret ; этот ret многое значит..
Что-то меня это операчии +2, -2 напрягают. Что-то много их.
DX168B, в ассемблере нет извращений.
Кстати, тут вспомнил один приём антидизассемблеринга применяющийся в x86: команда внутри команды. Суть в том, что каким нибуть переходом (желательно косвенным и неявным) происходит переход не на саму какую-нить безобидную команду, после которой находится код для отвода глаз, а куда-то в её центр, а там, например, переход на скрытый код внутри мусора. Естественно, дизассемблер такое фиг найдёт сам. Да и самому это не так просто заметить. Думаю, на AVR так же можно спрятать rjmp внутри какой нибудь lds.
На правах оффтопа. Люди, у вас эта тема нормально работает? Дело в том, что у меня такой глюк. Когда я жму на кнопочку "новые сообщения" для этой темы, меня часто бросает не на последнюю страницу, где эти сообщения, а на 2-3 страницы назад на их начало. Иногда бывает, что перебрасывает правильно. Такое же бы бывает, если я просто обновляю страницу, когда на
этой же появляется новое сообщение. Меня так же ни за что перекидывает на 2-3 страницы назад и приходится возвращаться.
Мало того, только что заметил, достаточно было
DX168B всего лишь
подредактировать своё сообщение (последнее сообщение в теме, но новых сообщений не было), как меня опять перекинуло!
Соответственно, если новых нет (или никто не обновляет пост), то всё нормально.
У кого нить такое наблюдается?