Обратное проектирование МК

Взлом микроконтроллеров - MikaTech

Наши ценности и цели

О MikaTech

Время пролетело быстро, с того дня, как мы выполнили наш первый проект по обратному проектированию МК 8051 в 1998 году, до того дня, когда мы создали нашу лабораторию обратного проектирования стоимостью в миллион долларов в 2012 году, прошло 14 лет. Теперь мы начинаем наш новый бизнес по разработке встроенных систем визуализации, надеемся, что сможем прослужить еще 10 лет.

подпись Peter Lee Со-основатель и генеральный директор

Архитектура и программирование МК 8051 для обратного проектирования 2

Глава 3: Система команд 8051

Введение

Написание программ для микроконтроллеров в основном заключается в выдаче инструкций (команд) в определенной последовательности выполнения для выполнения поставленных задач. Электронное оборудование не может интерпретировать логику, понятную человеку, например: «Если кнопка нажата, включи свет». Вместо этого разработчики должны использовать серию простых, строго определенных команд, распознаваемых внутренним декодером МК. Полная коллекция этих допустимых команд известна как система команд. Все совместимые с 8051 микроконтроллеры имеют в общей сложности 255 различных инструкций, то есть 255 уникальных машинных слов, доступных для разработки программ.

На первый взгляд, запоминание этого большого набора символических кодов операций кажется устрашающим. Однако реальная нагрузка по обучению гораздо легче, чем кажется. Многие инструкции считаются отдельными записями, даже если они выполняют одинаковые базовые операции, оставляя только 111 функционально уникальных команд. Например, ADD A,R0, ADD A,R1, ..., ADD A,R7 — все выполняют одну и ту же операцию сложения между аккумулятором и рабочим регистром. Поскольку существует восемь рабочих регистров, каждый вариант указан как отдельная запись инструкции. Учитывая, что все инструкции реализуют только 53 основные операции (сложение, вычитание, копирование данных и т. д.) и большинство из них редко используются в реальных проектах, разработчикам нужно освоить всего около 20–30 мнемоник — это вполне приемлемое количество.

Помимо функционального выполнения программ, система команд формирует первую линию защиты от несанкционированного доступа к прошивке. Большинство встраиваемых систем полагаются на механизмы битов блокировки для предотвращения внешнего считывания внутренней Flash или EEPROM памяти. Тем не менее, полное понимание поведения каждой инструкции во время выполнения необходимо как для написания безопасной производственной прошивки, так и для проведения законного обратного проектирования для восстановления утерянного исходного кода. Злоумышленники часто используют определенные поведения инструкций для обхода защиты блокировки, используя инжекцию ошибок, анализ времени выполнения и другие методы анализа побочных каналов для активации состояния разблокировки. Во многих сценариях атак физическая декапсуляция чипа в сочетании с микрозондированием позволяет напрямую считывать состояния битов предохранителей, что дает возможность полного дампа двоичных данных хранящейся прошивки. Способность воспроизвести полную функциональность устройства часто зависит от успешного извлечения прошивки с помощью этих методов, что делает восстановление прошивки критически важным навыком в области исследований безопасности встраиваемых систем.

3.1 Типы инструкций

Все инструкции делятся на пять основных групп в зависимости от выполняемых операций:

  • Арифметические инструкции
  • Инструкции переходов
  • Инструкции передачи данных
  • Логические инструкции
  • Битовые инструкции

Первый сегмент каждой инструкции называется мнемоникой, которая представляет основную операцию, которая должна быть выполнена (копирование данных, арифметическое сложение, побитовая логика и т. д.). Мнемоники являются сокращенными аббревиатурами для полного названия каждой аппаратной операции. Примеры определений показаны ниже:

  • INC R1 – Увеличить значение, хранящееся в регистре R1, на единицу;
  • LJMP LAB5 – Выполнить длинный безусловный переход на адрес памяти, помеченный как LAB5;
  • JNZ LOOP – Перейти по адресу LOOP, если значение аккумулятора не равно нулю;

Второй сегмент инструкции — это операнд, отделенный от мнемоники по крайней мере одним пробелом, который определяет цели данных, обрабатываемых операцией. Некоторые инструкции не имеют операндов, в то время как другие содержат один, два или три операнда. Несколько операндов в одной инструкции разделяются запятыми. Примеры:

  • RET – Возврат потока выполнения из подпрограммы;
  • JZ TEMP – Перейти по адресу TEMP, если значение аккумулятора равно нулю;
  • ADD A,R3 – Сложить значение регистра R3 с аккумулятором;
  • CJNE A,#20,LOOP – Сравнить аккумулятор с непосредственной константой 20; перейти к LOOP, если два значения не равны;

Каждая категория инструкций играет определенную роль в общей безопасности устройства. Битовые инструкции напрямую управляют битами блокировки и другими конфигурационными предохранителями безопасности. Коды операций передачи данных, такие как MOVC, читают память кода, и эти инструкции возвращают искаженные недействительные данные, когда активна защита битов блокировки. В рабочих процессах обратного проектирования часто фокусируются на идентификации последовательностей инструкций, которые проверяют состояние блокировки, а затем пытаются пропустить эти ветви проверки с помощью сбоев тактовой частоты или подделки счетчика программ. В некоторых случаях восстановление заблокированного МК требует поиска скрытых бэкдоров загрузчика, которые используют определенные инструкции ветвления для включения полного считывания памяти.

Арифметические инструкции

Арифметические инструкции выполняют фундаментальные математические операции, включая сложение, вычитание, умножение и деление. После завершения вычислений результирующее значение сохраняется в первом указанном операнде. Пример:

ADD A,R1 – Сумма аккумулятора A и регистра R1 сохраняется обратно в регистр аккумулятора.

Арифметические инструкции
Мнемоника Описание Байт Цикл
ADD A,Rn Сложить содержимое рабочего регистра с аккумулятором 1 1
ADD A,direct Сложить байт с прямым адресом с аккумулятором 2 2
ADD A,@Ri Сложить байт внутренней RAM с косвенной адресацией с аккумулятором 1 2
ADD A,#data Сложить непосредственную константу с аккумулятором 2 2
ADDC A,Rn Сложить регистр с аккумулятором с учетом флага переноса 1 1
ADDC A,direct Сложить прямой байт с аккумулятором с учетом флага переноса 2 2
ADDC A,@Ri Сложить байт косвенной RAM с аккумулятором с учетом флага переноса 1 2
ADDC A,#data Сложить непосредственную константу с аккумулятором с учетом флага переноса 2 2
SUBB A,Rn Вычесть регистр из аккумулятора с учетом флага займа 1 1
SUBB A,direct Вычесть прямой байт из аккумулятора с учетом флага займа 2 2
SUBB A,@Ri Вычесть байт косвенной RAM из аккумулятора с учетом флага займа 1 2
SUBB A,#data Вычесть непосредственную константу из аккумулятора с учетом флага займа 2 2
INC A Увеличить значение аккумулятора на единицу 1 1
INC Rn Увеличить значение рабочего регистра на единицу 1 2
INC Rx Увеличить байт с прямым адресом на единицу 2 3
INC @Ri Увеличить байт косвенной RAM на единицу 1 3
DEC A Уменьшить значение аккумулятора на единицу 1 1
DEC Rn Уменьшить значение рабочего регистра на единицу 1 1
DEC Rx Уменьшить байт с прямым адресом на единицу 1 2
DEC @Ri Уменьшить байт косвенной RAM на единицу 2 3
INC DPTR Увеличить 16-битный указатель данных на единицу 1 3
MUL AB Умножить аккумулятор A на регистр B 1 5
DIV AB Разделить аккумулятор A на регистр B 1 5
DA A Десятичная коррекция аккумулятора для результатов BCD-арифметики 1 1

Арифметические инструкции служат не только для обработки данных; они являются неотъемлемой частью процедур контрольной суммы и шифрования, которые проверяют целостность прошивки. Злоумышленники, которые могут исказить результаты сложения или вычитания с помощью сбоев напряжения, могут обойти проверки безопасности, которые сравнивают вычисленные контрольные суммы с сохраненными эталонными значениями. Эта манипуляция может запустить последовательность разблокировки, даже если бит блокировки остается установленным. Для рабочих процессов извлечения прошивки глубокое знание поведения ALU при арифметических операциях позволяет создавать целевые атаки с инжекцией ошибок, предназначенные для пропуска логики проверки блокировки. Кроме того, флаги состояния переноса (C) и переполнения (OV) являются частыми целями атак: сбой в арифметико-логическом устройстве может привести к принудительной установке неверных флагов и обходу критических проверок состояния блокировки.

Инструкции переходов

Инструкции переходов делятся на две отдельные категории:

Инструкции безусловного перехода: При выполнении ЦПУ немедленно переходит по новому адресу памяти и возобновляет поток программы с этого места без каких-либо предварительных условий.

Инструкции условного перехода: Переход на альтернативный адрес программы выполняется только в том случае, если указанное логическое условие истинно. Если условие ложно, ЦПУ переходит к следующей инструкции в памяти последовательно.

Инструкции переходов
Мнемоника Описание Байт Цикл
ACALL addr11 Абсолютный вызов подпрограммы в пределах 2 КБ страницы 2 6
LCALL addr16 Длинный вызов подпрограммы по полному 64 КБ адресу 3 6
RET Возврат из стандартной подпрограммы 1 4
RETI Возврат из подпрограммы обработки прерывания 1 4
AJMP addr11 Абсолютный переход в пределах текущей 2 КБ страницы памяти 2 3
LJMP addr16 Длинный переход на любой 64 КБ адрес программной памяти 3 4
SJMP rel Короткий относительный переход (смещение -128..+127 от следующей инструкции) 2 3
JC rel Короткий переход, если флаг переноса C установлен 2 3
JNC rel Короткий переход, если флаг переноса C сброшен 2 3
JB bit,rel Короткий переход, если указанный прямой бит равен логической 1 3 4
JBC bit,rel Переход, если прямой бит установлен, затем сбросить целевой бит 3 4
JMP @A+DPTR Косвенный индексный переход с использованием смещения аккумулятор + указатель данных 1 2
JZ rel Короткий переход, если аккумулятор равен нулю 2 3
JNZ rel Короткий переход, если аккумулятор содержит ненулевое значение 2 3
CJNE A,direct,rel Сравнить аккумулятор и прямой байт; короткий переход, если значения не равны 3 4
CJNE A,#data,rel Сравнить аккумулятор и непосредственную константу; короткий переход, если не равны 3 4
CJNE Rn,#data,rel Сравнить рабочий регистр и непосредственную константу; короткий переход, если не равны 3 4
CJNE @Ri,#data,rel Сравнить байт косвенной RAM и константу; короткий переход, если не равны 3 4
DJNZ Rn,rel Уменьшить регистр, короткий переход, если результат не равен нулю 2 3
DJNZ Rx,rel Уменьшить прямой байт, короткий переход, если результат не равен нулю 3 4
NOP Нет операции (заполнитель задержки тактового цикла) 1 1

Инструкции переходов образуют ядро условной программной логики, включая все критические подпрограммы проверки безопасности. Код операции JB, например, широко используется для проверки состояния бита блокировки. Если бит блокировки установлен, программа переходит к подпрограмме безопасности, которая отключает интерфейсы отладки и блокирует считывание памяти. Злоумышленники могут нацеливаться на выполнение инструкции JB с помощью сбоев тактовой частоты, чтобы заставить оборудование считать установленный бит блокировки как сброшенный, полностью разблокируя микроконтроллер. Аналогично, инструкции CJNE используются в циклах проверки паролей; внедрение сбоя синхронизации или напряжения во время сравнения может перенаправить счетчик программ на непредусмотренный адрес, открывая доступ к защищенному коду прошивки. В рабочих процессах обратного проектирования построение полного графа потока управления ветвлениями является обязательным для поиска легальных путей разблокировки и патчинга двоичной прошивки для восстановления данных.

Инструкции передачи данных

Коды операций передачи данных копируют значения из одного регистра или ячейки памяти в другой, оставляя исходные данные неизменными. Инструкции с суффиксом «X» (MOVX) обеспечивают обмен данными с внешними пространствами RAM.

Инструкции передачи данных
Мнемоника Описание Байт Цикл
MOV A,Rn Скопировать значение рабочего регистра в аккумулятор 1 1
MOV A,direct Скопировать байт с прямым адресом в аккумулятор 2 2
MOV A,@Ri Скопировать байт внутренней RAM с косвенной адресацией в аккумулятор 1 2
MOV A,#data Загрузить непосредственную константу в аккумулятор 2 2
MOV Rn,A Скопировать значение аккумулятора в рабочий регистр 1 2
MOV Rn,direct Скопировать байт с прямым адресом в рабочий регистр 2 4
MOV Rn,#data Загрузить непосредственную константу в рабочий регистр 2 2
MOV direct,A Скопировать значение аккумулятора в байт с прямым адресом 2 3
MOV direct,Rn Скопировать значение рабочего регистра в байт с прямым адресом 2 3
MOV direct,direct Скопировать один байт с прямым адресом в другой прямой адрес 3 4
MOV direct,@Ri Скопировать байт косвенной RAM в байт с прямым адресом 2 4
MOV direct,#data Загрузить непосредственную константу в байт с прямым адресом 3 3
MOV @Ri,A Скопировать значение аккумулятора в байт RAM с косвенной адресацией 1 3
MOV @Ri,direct Скопировать байт с прямым адресом в ячейку косвенной RAM 2 5
MOV @Ri,#data Загрузить непосредственную константу в байт косвенной RAM 2 3
MOV DPTR,#data Загрузить 16-битную непосредственную константу в указатель данных 3 3
MOVC A,@A+DPTR Прочитать байт памяти кода по смещению A+DPTR в аккумулятор 1 3
MOVC A,@A+PC Прочитать байт памяти кода по смещению A+PC в аккумулятор 1 3
MOVX A,@Ri Прочитать байт внешней RAM с 8-битным адресом в аккумулятор 1 3-10
MOVX A,@DPTR Прочитать байт внешней RAM с 16-битным адресом в аккумулятор 1 3-10
MOVX @Ri,A Записать значение аккумулятора по 8-битному адресу внешней RAM 1 4-11
MOVX @DPTR,A Записать значение аккумулятора по 16-битному адресу внешней RAM 1 4-11
PUSH direct Поместить байт с прямым адресом в системный стек 2 4
POP direct Извлечь верхнее значение стека в байт с прямым адресом 2 3
XCH A,Rn Обменять полные байтовые значения между аккумулятором и рабочим регистром 1 2
XCH A,direct Обменять полные байтовые значения между аккумулятором и прямым байтом 2 3
XCH A,@Ri Обменять полные байтовые значения между аккумулятором и байтом косвенной RAM 1 3
XCHD A,@Ri Обменять только младшие 4-битные полубайты аккумулятора и байта косвенной RAM 1 3

Инструкции передачи данных чаще всего встречаются во всех встраиваемых прошивках и одновременно представляют собой критические поверхности атак для эксплойтов безопасности. Коды операций MOVC специально разработаны для чтения программной памяти кода; когда активна защита битов блокировки, эти инструкции возвращают искаженные бессмысленные данные. Однако применение точного сбоя напряжения во время выполнения MOVC может заставить МК выводить неизмененные исходные байты кода, что позволяет проводить побайтовые дампы Flash-памяти, широко используемые в обратном проектировании с использованием побочных каналов. Инструкции MOVX обращаются к незашифрованным шинам внешней памяти, которые злоумышленники могут пассивно отслеживать с помощью логических анализаторов для полного дублирования прошивки без вмешательства во внутренние предохранители безопасности. Для внутреннего хранилища EEPROM варианты MOV direct обеспечивают доступ для чтения/записи к специальным функциональным регистрам, управляющим состоянием предохранителей блокировки; незакрытые интерфейсы отладки позволяют злоумышленникам использовать простые последовательности MOV для разблокировки чипа и выполнения полного извлечения памяти. PUSH и POP управляют стековой памятью, общей целью для эксплойтов переполнения стека, которые перезаписывают адреса возврата и перенаправляют выполнение на вредоносные подпрограммы разблокировки. При судебном восстановлении заблокированных встраиваемых устройств аналитики отслеживают все последовательности инструкций MOV для поиска недокументированных бэкдоров производителя, намеренно оставленных для заводской перезаписи устройств.

Логические инструкции

Логические инструкции выполняют побитовые логические операции над соответствующими битовыми позициями двух байтовых операндов, сохраняя окончательный вычисленный результат внутри первого регистра операнда.

Логические инструкции
Мнемоника Описание Байт Цикл
ANL A,Rn Побитовое И рабочего регистра с аккумулятором 1 1
ANL A,direct Побитовое И байта с прямым адресом с аккумулятором 2 2
ANL A,@Ri Побитовое И байта косвенной RAM с аккумулятором 1 2
ANL A,#data Побитовое И непосредственной константы с аккумулятором 2 2
ANL direct,A Побитовое И аккумулятора с байтом прямого адреса, сохранить результат в прямом байте 2 3
ANL direct,#data Побитовое И непосредственной константы с байтом прямого адреса 3 4
ORL A,Rn Побитовое ИЛИ рабочего регистра с аккумулятором 1 1
ORL A,direct Побитовое ИЛИ байта с прямым адресом с аккумулятором 2 2
ORL A,@Ri Побитовое ИЛИ байта косвенной RAM с аккумулятором 1 2
ORL direct,A Побитовое ИЛИ аккумулятора с байтом прямого адреса, сохранить результат в прямом байте 2 3
ORL direct,#data Побитовое ИЛИ непосредственной константы с байтом прямого адреса 3 4
XRL A,Rn Побитовое исключающее ИЛИ рабочего регистра с аккумулятором 1 1
XRL A,direct Побитовое исключающее ИЛИ байта с прямым адресом с аккумулятором 2 2
XRL A,@Ri Побитовое исключающее ИЛИ байта косвенной RAM с аккумулятором 1 2
XRL A,#data Побитовое исключающее ИЛИ непосредственной константы с аккумулятором 2 2
XRL direct,A Побитовое исключающее ИЛИ аккумулятора с байтом прямого адреса, сохранить результат в прямом байте 2 3
XRL direct,#data Побитовое исключающее ИЛИ непосредственной константы с байтом прямого адреса 3 4
CLR A Обнулить все биты регистра аккумулятора 1 1
CPL A Побитово инвертировать все биты внутри аккумулятора 1 1
SWAP A Обменять старший и младший полубайты внутри аккумулятора 1 1
RL A Циклический сдвиг битов аккумулятора влево на одну позицию (без участия переноса) 1 1
RLC A Циклический сдвиг аккумулятора влево через флаг переноса 1 1
RR A Циклический сдвиг битов аккумулятора вправо на одну позицию (без участия переноса) 1 1
RRC A Циклический сдвиг аккумулятора вправо через флаг переноса 1 1

Побитовые логические инструкции широко используются для маскировки и управления битами предохранителей блокировки и другими критическими регистрами конфигурации безопасности. Например, маски ANL могут выборочно очищать отдельные биты в SFR управления безопасностью, в то время как маски ORL устанавливают определенные биты включения предохранителей. Злоумышленники, способные внедрять сбои синхронизации или напряжения во время выполнения этих логических кодов операций, могут случайно переключить состояние бита блокировки и полностью разблокировать микроконтроллер. Кроме того, инструкции исключающего ИЛИ XRL составляют основу распространенных методов обфускации прошивки и легковесного шифрования; обратное преобразование операции XOR позволяет злоумышленникам восстановить открытые ключи безопасности, хранящиеся в памяти EEPROM. Для рабочих процессов извлечения прошивки глубокое понимание побитовых логических операций необходимо для расшифровки обфусцированных защищенных сегментов кода перед инициированием полных дампов двоичной памяти.

Битовые инструкции

Битовые инструкции выполняют логические операции, аналогичные группе побайтовой логики, но они работают исключительно с отдельными битовыми позициями, а не с полными 8-битными байтами.

Битовые инструкции
Мнемоника Описание Байт Цикл
CLR C Сбросить флаг переноса в логический 0 1 1
CLR bit Сбросить указанную битовую ячейку с прямым адресом в логический 0 2 3
SETB C Установить флаг переноса в логическую 1 1 1
SETB bit Установить указанную битовую ячейку с прямым адресом в логическую 1 2 3
CPL C Инвертировать логическое состояние флага переноса 1 1
CPL bit Инвертировать логическое состояние указанной прямой битовой ячейки 2 3
ANL C,bit Побитовое И целевого прямого бита с флагом переноса, сохранить результат в C 2 2
ANL C,/bit Побитовое И инвертированного целевого бита с флагом переноса, сохранить результат в C 2 2
ORL C,bit Побитовое ИЛИ целевого прямого бита с флагом переноса, сохранить результат в C 2 2
ORL C,/bit Побитовое ИЛИ инвертированного целевого бита с флагом переноса, сохранить результат в C 2 2
MOV C,bit Скопировать логическое состояние прямого бита в регистр флага переноса 2 2
MOV bit,C Скопировать логическое состояние флага переноса в указанную прямую битовую ячейку 2 3

Битовые коды операций представляют собой основной программный интерфейс для управления битами предохранителей блокировки и другими критическими для безопасности однобитовыми флагами конфигурации. SETB и CLR могут напрямую изменять состояния предохранителей блокировки, хотя большинство современных производных МК 8051 имеют аппаратную защиту, делающую регистры битов блокировки доступными только для чтения во время обычного выполнения. Критические ошибки программного обеспечения, допускающие запись в эти битовые регистры безопасности, создают векторы атак для удаленной разблокировки злоумышленниками. Инструкция MOV C,bit считывает состояние предохранителя блокировки и передает значение во флаг переноса, который последующие условные переходы JC/JNC оценивают для применения ограничений доступа к памяти. Эта стандартная последовательность проверки блокировки является основной целью для атак с инжекцией сбоев: искусственное изменение флага переноса обходит всю ветвь проверки безопасности. При физических атаках на основе декапсуляции чипа микрозондирование напрямую обращается к этим битовым ячейкам предохранителей для считывания сырых состояний битов блокировки, что позволяет выполнять полные дампы программной памяти без изменения какого-либо кода прошивки.

3.2 Описание всех инструкций 8051

Ниже приведен справочный глоссарий, определяющий все стандартные обозначения операндов, используемые в системе команд 8051:

  • A – Регистр аккумулятора;
  • Rn – Любой рабочий регистр (от R0 до R7) в текущем активном банке регистров RAM;
  • Direct – Любой 8-битный байтовый адрес RAM, охватывающий внутреннюю RAM общего назначения или все специальные функциональные регистры (порты ввода-вывода, управляющие регистры, регистры состояния периферии);
  • @Ri – Байт внутренней или внешней RAM с косвенной адресацией, при этом адрес памяти хранится в регистре-указателе R0 или R1;
  • #data – 8-битная непосредственная константа, встроенная непосредственно в код операции инструкции (допустимый диапазон 0–255);
  • #data16 – 16-битная непосредственная константа, хранящаяся как второй и третий байты 3-байтовой инструкции (диапазон 0–65535);
  • addr16 – Полный 16-битный адрес программной памяти, способный ссылаться на любое место в полном 64 КБ адресном пространстве кода;
  • addr11 – 11-битный частичный адрес, ограниченный переходами/вызовами, находящимися в пределах той же 2 КБ страницы памяти, что и байт, следующий за инструкцией ACALL/AJMP;
  • rel – Байт относительного смещения для коротких переходов, в диапазоне от -128 до +127 относительно первого байта инструкции сразу после кода операции перехода. Ассемблер автоматически вычисляет необходимое значение смещения для добавления или вычитания из текущего адреса счетчика программ;
  • bit – Любой битово-адресуемый вывод GPIO, флаг управляющего регистра или бит состояния в пространстве RAM/SFR;
  • C – Глобальный флаг переноса, содержащийся в регистре слова состояния программы PSW.

Эти обозначения операндов определяют полный спектр режимов адресации 8051 и необходимы для поиска адресов предохранителей блокировки в карте памяти чипа. Стандартный рабочий процесс обратного проектирования сканирует двоичную прошивку на наличие ссылок на прямые операнды, указывающие на адреса SFR безопасности, а затем отслеживает все пути инструкций чтения/записи, нацеленных на эти регистры. Этот статический анализ часто выявляет недокументированные заводские тестовые режимы или скрытые пути бэкдора, которые обеспечивают полное считывание памяти даже при активной защите битов блокировки. Для легальных проектов восстановления данных прошивки точное понимание каждого типа операндов позволяет точно восстанавливать структуру полных дампов памяти и правильно интерпретировать извлеченные двоичные файлы кода.

ACALL addr11 – Абсолютный вызов подпрограммы в пределах 2 КБ страницы

addr11: Адрес памяти подпрограммы (11-битное смещение страницы)

Описание: Этот код операции безусловно помещает адрес возврата счетчика программ в системный стек и переходит к выполнению по указанному адресу подпрограммы. Действует критическое ограничение: следующий байт текущей инструкции и точка входа в целевую подпрограмму должны находиться в пределах одной и той же 2 КБ границы страницы программной памяти.

Синтаксис: ACALL [метка_подпрограммы];
Байты инструкции: 2 (байт кода операции, 11-битный адрес);
Затронутые флаги PSW: Инструкция не изменяет флаги состояния.

ПРИМЕР:

ACALL

Значение PC до выполнения = 0123h
Значение PC после выполнения = 0345h

Этот код операции вызова подпрограммы часто встречается в прошивке загрузчика МК. Злоумышленники, способные перезаписать 11-битный операнд addr11 с помощью переполнения буфера, могут перенаправить выполнение программы на пользовательские подпрограммы разблокировки, которые отключают защиту битов блокировки. В большинстве сценариев восстановления обратным проектированием патчинг двоичного кода целевого адреса ACALL представляет собой простой метод для обеспечения полного извлечения прошивки Flash.

ADD A,Rn – Сложить значение рабочего регистра с регистром аккумулятора

A: Регистр аккумулятора
 Rn: Любой рабочий регистр от R0 до R7

Описание: Код операции выполняет сложение байтов без знака между аккумулятором и выбранным рабочим регистром Rn, сохраняя полученную сумму обратно в регистр аккумулятора.

Синтаксис: ADD A,Rn;

ADD A,direct – Сложить байт с прямым адресом с аккумулятором

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет сложение между аккумулятором и байтом, расположенным по прямому адресу. Прямая адресация позволяет обращаться к любому SFR или регистру RAM общего назначения в диапазоне адресов 00h–7Fh. Результат сохраняется в аккумуляторе.

Синтаксис: ADD A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

ADD A,direct

До выполнения: A=45h, SUM=33h
После выполнения: A=78h

ADD A,@Ri – Сложить байт косвенной внутренней RAM с аккумулятором

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция складывает значение байта внутренней RAM, адрес которого хранится в Ri (R0 или R1), с аккумулятором. Результат сохраняется в аккумуляторе.

Синтаксис: ADD A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

ADD A,@Ri

Адрес RAM: SUM=F3h, R1=F3h
До выполнения: A=45h, SUM=33h
После выполнения: A=78h

ADD A,#data – Сложить непосредственную константу с аккумулятором

Data: 8-битная константа (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет сложение аккумулятора и непосредственной константы, встроенной в код операции. Результат сохраняется в аккумуляторе.

Синтаксис: ADD A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

ADD A,#X

До выполнения: A=45h
После выполнения: A=78h

ADDC A,Rn – Сложить регистр с аккумулятором с учетом флага переноса

Rn: Любой рабочий регистр от R0 до R7
 A: Регистр аккумулятора

Описание: Инструкция складывает значение рабочего регистра и флаг переноса C с аккумулятором. Результат сохраняется в аккумуляторе. Флаг C устанавливается, если возникает перенос из старшего бита.

Синтаксис: ADDC A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

ADDC A,Rn

До выполнения: A=C9h, R0=12h, C=1
После выполнения: A=DCh, C=0

ADDC A,direct – Сложить прямой байт с аккумулятором с учетом флага переноса

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция складывает байт по прямому адресу и флаг переноса C с аккумулятором. Результат сохраняется в аккумуляторе.

Синтаксис: ADDC A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

ADDC A,Rx

До выполнения: A=C9h, DIF=12h, C=1
После выполнения: A=DCh, C=0

ADDC A,@Ri – Сложить байт косвенной RAM с аккумулятором с учетом флага переноса

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция складывает байт внутренней RAM, адрес которого хранится в Ri, и флаг переноса C с аккумулятором. Результат сохраняется в аккумуляторе.

Синтаксис: ADDC A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

ADDC A,@Ri

Адрес RAM: MIN=10h, R1=10h
До выполнения: A=C9h, MIN=12h, C=1
После выполнения: A=DCh, C=0

ADDC A,#data – Сложить непосредственную константу с аккумулятором с учетом флага переноса

Data: 8-битная константа (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция складывает непосредственную константу и флаг переноса C с аккумулятором. Результат сохраняется в аккумуляторе.

Синтаксис: ADDC A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

ADDC A,#X

До выполнения: A=C9h, C=1
После выполнения: A=DCh, C=0

AJMP addr11 – Абсолютный переход в пределах 2 КБ страницы

addr11: 11-битный адрес перехода

Описание: Код операции выполняет безусловный переход на указанный 11-битный адрес в пределах текущей 2 КБ страницы программной памяти.

Синтаксис: AJMP [метка];
Количество байт: 2 (байт кода операции, 11-битный адрес);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

AJMP addr11

До выполнения: PC=0123h
После выполнения: PC=0345h

ANL A,Rn – Побитовое И рабочего регистра с аккумулятором

Rn: Любой рабочий регистр от R0 до R7
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию И между аккумулятором и рабочим регистром Rn. Результат сохраняется в аккумуляторе.

Синтаксис: ANL A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ANL A,Rn

До выполнения: A=C3h (11000011), R5=55h (01010101)
После выполнения: A=41h (01000001)

ANL A,direct – Побитовое И байта с прямым адресом с аккумулятором

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию И между аккумулятором и байтом по прямому адресу. Результат сохраняется в аккумуляторе.

Синтаксис: ANL A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ANL A,Rx

До выполнения: A=C3h (11000011), LOG=55h (01010101)
После выполнения: A=41h (01000001)

ANL A,@Ri – Побитовое И байта косвенной RAM с аккумулятором

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию И между аккумулятором и байтом внутренней RAM, адрес которого хранится в Ri. Результат сохраняется в аккумуляторе.

Синтаксис: ANL A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ANL A,@Ri

Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: A=40h (01000000)

ANL A,#data – Побитовое И непосредственной константы с аккумулятором

Data: 8-битная константа (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию И между аккумулятором и непосредственной константой. Результат сохраняется в аккумуляторе.

Синтаксис: ANL A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ANL A,#X

До выполнения: A=C3h (11000011)
После выполнения: A=41h (01000001)

ANL direct,A – Побитовое И аккумулятора с байтом прямого адреса, сохранить результат в прямом байте

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию И между байтом по прямому адресу и аккумулятором. Результат сохраняется по прямому адресу.

Синтаксис: ANL direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ANL Rx,A

До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: TEMP=40h (01000000)

ANL direct,#data – Побитовое И непосредственной константы с байтом прямого адреса

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 Data: 8-битная константа (00h до FFh)

Описание: Инструкция выполняет побитовую операцию И между байтом по прямому адресу и непосредственной константой. Результат сохраняется по прямому адресу.

Синтаксис: ANL direct,#data;
Количество байт: 3 (байт кода операции, байт адреса, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ANL Rx,#X

До выполнения: TEMP=C3h (11000011)
После выполнения: TEMP=41h (01000001)

CJNE A,direct,rel – Сравнить аккумулятор и прямой байт; переход, если не равны

A: Регистр аккумулятора
 Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 rel: Относительное смещение

Описание: Инструкция сравнивает значение аккумулятора с байтом по прямому адресу. Если значения не равны, выполняется переход по относительному адресу. Если значения равны, выполнение продолжается со следующей инструкции. Флаг C устанавливается, если значение аккумулятора меньше значения прямого байта.

Синтаксис: CJNE A,direct,rel;
Количество байт: 3 (байт кода операции, байт адреса, байт смещения);
Затронутые флаги PSW: C;

ПРИМЕР:

CJNE A,Rx,rel

До выполнения: A=55h, TEMP=33h
После выполнения: Переход к LOOP, если 55h != 33h

CJNE A,#data,rel – Сравнить аккумулятор и непосредственную константу; переход, если не равны

A: Регистр аккумулятора
 Data: 8-битная константа (00h до FFh)
 rel: Относительное смещение

Описание: Инструкция сравнивает значение аккумулятора с непосредственной константой. Если значения не равны, выполняется переход по относительному адресу. Если значения равны, выполнение продолжается со следующей инструкции. Флаг C устанавливается, если значение аккумулятора меньше константы.

Синтаксис: CJNE A,#data,rel;
Количество байт: 3 (байт кода операции, байт данных, байт смещения);
Затронутые флаги PSW: C;

ПРИМЕР:

CJNE A,#X,rel

До выполнения: A=55h
После выполнения: Переход к LOOP, если 55h != 33h

CJNE Rn,#data,rel – Сравнить рабочий регистр и непосредственную константу; переход, если не равны

Rn: Рабочий регистр от R0 до R7
 Data: 8-битная константа (00h до FFh)
 rel: Относительное смещение

Описание: Инструкция сравнивает значение рабочего регистра с непосредственной константой. Если значения не равны, выполняется переход по относительному адресу. Если значения равны, выполнение продолжается со следующей инструкции. Флаг C устанавливается, если значение регистра меньше константы.

Синтаксис: CJNE Rn,#data,rel;
Количество байт: 3 (байт кода операции, байт данных, байт смещения);
Затронутые флаги PSW: C;

ПРИМЕР:

CJNE Rn,#X,rel

До выполнения: R3=55h
После выполнения: Переход к LOOP, если R3 != 33h

CJNE @Ri,#data,rel – Сравнить байт косвенной RAM и непосредственную константу; переход, если не равны

Ri: Регистр косвенной адресации R0 или R1
 Data: 8-битная константа (00h до FFh)
 rel: Относительное смещение

Описание: Инструкция сравнивает байт внутренней RAM, адрес которого хранится в Ri, с непосредственной константой. Если значения не равны, выполняется переход по относительному адресу. Если значения равны, выполнение продолжается со следующей инструкции. Флаг C устанавливается, если значение из RAM меньше константы.

Синтаксис: CJNE @Ri,#data,rel;
Количество байт: 3 (байт кода операции, байт данных, байт смещения);
Затронутые флаги PSW: C;

ПРИМЕР:

CJNE @Ri,#X,rel

Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=55h
После выполнения: Переход к LOOP, если TEMP != 33h

CLR A – Обнулить аккумулятор

A: Регистр аккумулятора

Описание: Инструкция устанавливает все биты аккумулятора в 0.

Синтаксис: CLR A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

CLR A

До выполнения: A=C3h
После выполнения: A=00h

CLR C – Сбросить флаг переноса

C: Флаг переноса

Описание: Инструкция устанавливает флаг переноса C в 0.

Синтаксис: CLR C;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C=0;

ПРИМЕР:

CLR C

До выполнения: C=1
После выполнения: C=0

CLR bit – Сбросить битовую ячейку с прямым адресом

Bit: Битово-адресуемая ячейка

Описание: Инструкция устанавливает указанную битовую ячейку в 0.

Синтаксис: CLR bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

CLR bit

До выполнения: P0.1=1
После выполнения: P0.1=0

CPL A – Инвертировать аккумулятор

A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую инверсию аккумулятора.

Синтаксис: CPL A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

CPL A

До выполнения: A=C3h (11000011)
После выполнения: A=3Ch (00111100)

CPL C – Инвертировать флаг переноса

C: Флаг переноса

Описание: Инструкция инвертирует состояние флага переноса C.

Синтаксис: CPL C;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C инвертируется;

ПРИМЕР:

CPL C

До выполнения: C=0
После выполнения: C=1

CPL bit – Инвертировать битовую ячейку с прямым адресом

Bit: Битово-адресуемая ячейка

Описание: Инструкция инвертирует состояние указанной битовой ячейки.

Синтаксис: CPL bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

CPL bit

До выполнения: P0.1=0
После выполнения: P0.1=1

DA A – Десятичная коррекция аккумулятора

A: Регистр аккумулятора

Описание: Инструкция выполняет десятичную коррекцию аккумулятора после операций сложения для BCD-арифметики.

Синтаксис: DA A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C;

ПРИМЕР:

DA A

До выполнения: A=56h, C=0
После выполнения: A=62h, C=0

DEC A – Уменьшить аккумулятор на единицу

A: Регистр аккумулятора

Описание: Инструкция уменьшает значение аккумулятора на 1.

Синтаксис: DEC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

DEC A

До выполнения: A=45h
После выполнения: A=44h

DEC Rn – Уменьшить рабочий регистр на единицу

Rn: Рабочий регистр от R0 до R7

Описание: Инструкция уменьшает значение рабочего регистра Rn на 1.

Синтаксис: DEC Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

DEC Rn

До выполнения: R5=45h
После выполнения: R5=44h

DEC Rx – Уменьшить байт с прямым адресом на единицу

Direct: Регистр с адресом от 0 до 255 (00h до FFh)

Описание: Инструкция уменьшает значение байта по прямому адресу на 1.

Синтаксис: DEC direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

DEC Rx

До выполнения: TEMP=45h
После выполнения: TEMP=44h

DEC @Ri – Уменьшить байт косвенной RAM на единицу

Ri: Регистр косвенной адресации R0 или R1

Описание: Инструкция уменьшает значение байта внутренней RAM, адрес которого хранится в Ri, на 1.

Синтаксис: DEC @Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

DEC @Ri

Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=45h
После выполнения: TEMP=44h

DIV AB – Разделить аккумулятор на регистр B

A: Регистр аккумулятора (делимое)
 B: Регистр B (делитель)

Описание: Инструкция выполняет деление аккумулятора на регистр B. Частное сохраняется в аккумуляторе, остаток — в регистре B. Если делитель равен 0, флаги OV и C устанавливаются.

Синтаксис: DIV AB;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C, OV;

ПРИМЕР:

DIV AB

До выполнения: A=1Bh (27), B=06h (6)
После выполнения: A=04h (4), B=03h (3)

DJNZ Rn,rel – Уменьшить регистр и переход, если не ноль

Rn: Рабочий регистр от R0 до R7
 rel: Относительное смещение

Описание: Инструкция уменьшает значение рабочего регистра на 1. Если результат не равен 0, выполняется переход по относительному адресу.

Синтаксис: DJNZ Rn,rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

DJNZ Rn,rel

До выполнения: R5=05h
После выполнения: R5=04h, переход к LOOP

DJNZ Rx,rel – Уменьшить байт прямого адреса и переход, если не ноль

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 rel: Относительное смещение

Описание: Инструкция уменьшает значение байта по прямому адресу на 1. Если результат не равен 0, выполняется переход по относительному адресу.

Синтаксис: DJNZ direct,rel;
Количество байт: 3 (байт кода операции, байт адреса, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

DJNZ Rx,rel

До выполнения: TEMP=05h
После выполнения: TEMP=04h, переход к LOOP

INC A – Увеличить аккумулятор на единицу

A: Регистр аккумулятора

Описание: Инструкция увеличивает значение аккумулятора на 1.

Синтаксис: INC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

INC A

До выполнения: A=45h
После выполнения: A=46h

INC Rn – Увеличить рабочий регистр на единицу

Rn: Рабочий регистр от R0 до R7

Описание: Инструкция увеличивает значение рабочего регистра Rn на 1.

Синтаксис: INC Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

INC Rn

До выполнения: R5=45h
После выполнения: R5=46h

INC Rx – Увеличить байт с прямым адресом на единицу

Direct: Регистр с адресом от 0 до 255 (00h до FFh)

Описание: Инструкция увеличивает значение байта по прямому адресу на 1.

Синтаксис: INC direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

INC Rx

До выполнения: TEMP=45h
После выполнения: TEMP=46h

INC @Ri – Увеличить байт косвенной RAM на единицу

Ri: Регистр косвенной адресации R0 или R1

Описание: Инструкция увеличивает значение байта внутренней RAM, адрес которого хранится в Ri, на 1.

Синтаксис: INC @Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

INC @Ri

Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=45h
После выполнения: TEMP=46h

INC DPTR – Увеличить указатель данных на единицу

DPTR: 16-битный указатель данных

Описание: Инструкция увеличивает значение 16-битного указателя данных DPTR на 1.

Синтаксис: INC DPTR;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

INC DPTR

До выполнения: DPTR=1234h
После выполнения: DPTR=1235h

JB bit,rel – Переход, если бит установлен

Bit: Битово-адресуемая ячейка
 rel: Относительное смещение

Описание: Инструкция проверяет указанный бит. Если бит равен 1, выполняется переход по относительному адресу.

Синтаксис: JB bit,rel;
Количество байт: 3 (байт кода операции, байт адреса бита, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

JB bit,rel

До выполнения: P1.3=1
После выполнения: Переход к LABEL

JBC bit,rel – Переход, если бит установлен, затем сбросить бит

Bit: Битово-адресуемая ячейка
 rel: Относительное смещение

Описание: Инструкция проверяет указанный бит. Если бит равен 1, выполняется переход по относительному адресу, а затем бит сбрасывается в 0.

Синтаксис: JBC bit,rel;
Количество байт: 3 (байт кода операции, байт адреса бита, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

JBC bit,rel

До выполнения: P1.3=1
После выполнения: Переход к LABEL, P1.3=0

JC rel – Переход, если флаг переноса установлен

rel: Относительное смещение

Описание: Инструкция проверяет флаг переноса C. Если C=1, выполняется переход по относительному адресу.

Синтаксис: JC rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

JC rel

До выполнения: C=1
После выполнения: Переход к LABEL

JMP @A+DPTR – Косвенный переход по адресу A+DPTR

A: Регистр аккумулятора
 DPTR: 16-битный указатель данных

Описание: Инструкция выполняет переход на адрес, вычисленный как сумма аккумулятора и указателя данных DPTR.

Синтаксис: JMP @A+DPTR;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

JMP @A+DPTR

До выполнения: DPTR=1000h, A=05h
После выполнения: Переход на адрес 1005h

JNC rel – Переход, если флаг переноса сброшен

rel: Относительное смещение

Описание: Инструкция проверяет флаг переноса C. Если C=0, выполняется переход по относительному адресу.

Синтаксис: JNC rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

JNC rel

До выполнения: C=0
После выполнения: Переход к LABEL

JNZ rel – Переход, если аккумулятор не равен нулю

rel: Относительное смещение

Описание: Инструкция проверяет аккумулятор. Если A != 0, выполняется переход по относительному адресу.

Синтаксис: JNZ rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

JNZ rel

До выполнения: A=55h
После выполнения: Переход к LABEL

JZ rel – Переход, если аккумулятор равен нулю

rel: Относительное смещение

Описание: Инструкция проверяет аккумулятор. Если A = 0, выполняется переход по относительному адресу.

Синтаксис: JZ rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

JZ rel

До выполнения: A=00h
После выполнения: Переход к LABEL

LCALL addr16 – Длинный вызов подпрограммы

addr16: 16-битный адрес подпрограммы

Описание: Инструкция выполняет безусловный вызов подпрограммы по 16-битному адресу. Адрес возврата сохраняется в стеке.

Синтаксис: LCALL addr16;
Количество байт: 3 (байт кода операции, два байта адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

LCALL addr16

До выполнения: PC=0123h
После выполнения: Переход на адрес 3456h

LJMP addr16 – Длинный безусловный переход

addr16: 16-битный адрес перехода

Описание: Инструкция выполняет безусловный переход на 16-битный адрес.

Синтаксис: LJMP addr16;
Количество байт: 3 (байт кода операции, два байта адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

LJMP addr16

До выполнения: PC=0123h
После выполнения: Переход на адрес 3456h

MOV A,Rn – Скопировать рабочий регистр в аккумулятор

Rn: Рабочий регистр от R0 до R7
 A: Регистр аккумулятора

Описание: Инструкция копирует значение рабочего регистра Rn в аккумулятор.

Синтаксис: MOV A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV A,Rn

До выполнения: R5=45h
После выполнения: A=45h

MOV A,direct – Скопировать байт с прямым адресом в аккумулятор

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция копирует байт по прямому адресу в аккумулятор.

Синтаксис: MOV A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV A,direct

До выполнения: TEMP=45h
После выполнения: A=45h

MOV A,@Ri – Скопировать байт косвенной RAM в аккумулятор

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция копирует байт внутренней RAM, адрес которого хранится в Ri, в аккумулятор.

Синтаксис: MOV A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV A,@Ri

Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=45h
После выполнения: A=45h

MOV A,#data – Загрузить непосредственную константу в аккумулятор

Data: 8-битная константа (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция загружает непосредственную константу в аккумулятор.

Синтаксис: MOV A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV A,#data

После выполнения: A=45h

MOV Rn,A – Скопировать аккумулятор в рабочий регистр

A: Регистр аккумулятора
 Rn: Рабочий регистр от R0 до R7

Описание: Инструкция копирует значение аккумулятора в рабочий регистр Rn.

Синтаксис: MOV Rn,A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV Rn,A

До выполнения: A=45h
После выполнения: R5=45h

MOV Rn,direct – Скопировать байт с прямым адресом в рабочий регистр

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 Rn: Рабочий регистр от R0 до R7

Описание: Инструкция копирует байт по прямому адресу в рабочий регистр Rn.

Синтаксис: MOV Rn,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV Rn,direct

До выполнения: TEMP=45h
После выполнения: R5=45h

MOV Rn,#data – Загрузить непосредственную константу в рабочий регистр

Data: 8-битная константа (00h до FFh)
 Rn: Рабочий регистр от R0 до R7

Описание: Инструкция загружает непосредственную константу в рабочий регистр Rn.

Синтаксис: MOV Rn,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV Rn,#data

После выполнения: R5=45h

MOV direct,A – Скопировать аккумулятор в байт с прямым адресом

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция копирует значение аккумулятора в байт по прямому адресу.

Синтаксис: MOV direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV direct,A

До выполнения: A=45h
После выполнения: TEMP=45h

MOV direct,Rn – Скопировать рабочий регистр в байт с прямым адресом

Rn: Рабочий регистр от R0 до R7
 Direct: Регистр с адресом от 0 до 255 (00h до FFh)

Описание: Инструкция копирует значение рабочего регистра Rn в байт по прямому адресу.

Синтаксис: MOV direct,Rn;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV direct,Rn

До выполнения: R5=45h
После выполнения: TEMP=45h

MOV direct,direct – Скопировать байт с прямым адресом в байт с прямым адресом

Direct1: Регистр-источник с адресом от 0 до 255 (00h до FFh)
 Direct2: Регистр-приемник с адресом от 0 до 255 (00h до FFh)

Описание: Инструкция копирует значение из одного байта с прямым адресом в другой. Исходное значение сохраняется.

Синтаксис: MOV direct1,direct2;
Количество байт: 3 (байт кода операции, два байта адресов);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV Rx,Ry

До выполнения: TEMP=58h
После выполнения: TEMP=58h, SUM=58h

MOV @Ri,A – Скопировать аккумулятор в ячейку косвенной RAM

A: Регистр аккумулятора
 Ri: Регистр косвенной адресации R0 или R1

Описание: Инструкция копирует значение аккумулятора в ячейку внутренней RAM, адрес которой хранится в Ri.

Синтаксис: MOV @Ri,A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV @Ri,A

Адрес RAM: SUM=F2h, R0=F2h
До выполнения: A=58h
После выполнения: SUM=58h

MOV direct,#data – Загрузить непосредственную константу в байт с прямым адресом

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 Data: 8-битная константа (00h до FFh)

Описание: Инструкция загружает непосредственную константу в байт по прямому адресу.

Синтаксис: MOV direct,#data;
Количество байт: 3 (байт кода операции, байт адреса, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV Rx,#X

После выполнения: TEMP=22h

MOV @Ri,#data – Загрузить непосредственную константу в ячейку косвенной RAM

Ri: Регистр косвенной адресации R0 или R1
 Data: 8-битная константа (00h до FFh)

Описание: Инструкция загружает непосредственную константу в ячейку внутренней RAM, адрес которой хранится в Ri.

Синтаксис: MOV @Ri,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV @Ri,#X

Адрес RAM: TEMP=E2h, R1=E2h
После выполнения: TEMP=44h

MOV @Ri,direct – Скопировать байт с прямым адресом в ячейку косвенной RAM

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 Ri: Регистр косвенной адресации R0 или R1

Описание: Инструкция копирует байт с прямым адресом в ячейку внутренней RAM, адрес которой хранится в Ri.

Синтаксис: MOV @Ri,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV @Ri,Rx

Адрес RAM: TEMP=E2h, R1=E2h
До выполнения: SUM=58h
После выполнения: TEMP=58h

MOV bit,C – Скопировать флаг переноса в бит

C: Флаг переноса
 Bit: Битово-адресуемая ячейка

Описание: Инструкция копирует состояние флага переноса C в указанный бит.

Синтаксис: MOV bit,C;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV bit,C

После выполнения: Если C=0, то P1.2=0; если C=1, то P1.2=1

MOV C,bit – Скопировать бит в флаг переноса

C: Флаг переноса
 Bit: Битово-адресуемая ячейка

Описание: Инструкция копирует состояние указанного бита в флаг переноса C.

Синтаксис: MOV C,bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: C обновляется;

ПРИМЕР:

MOV C,bit

После выполнения: Если P1.4=0, то C=0; если P1.4=1, то C=1

Эта инструкция считывает бит блокировки в флаг переноса. Сбой напряжения или тактовой частоты во время чтения целевого бита может исказить значение флага переноса, что может позволить злоумышленникам обойти логику проверки блокировки.

MOVC A,@A+DPTR – Прочитать байт памяти кода по адресу A+DPTR

A: Регистр аккумулятора
 DPTR: 16-битный указатель данных

Описание: Инструкция вычисляет сумму DPTR и A, затем читает байт из программной памяти по полученному адресу и сохраняет его в аккумулятор.

Синтаксис: MOVC A,@A+DPTR;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOVC A,@A+DPTR

До выполнения: DPTR=1000h, A=0,1,2,3
После выполнения: A=66h,77h,88h,99h

Примечание: DB (Define Byte) — директива ассемблера для определения констант в памяти программ.

Это основной код операции для чтения Flash-памяти программ. Заблокированные микроконтроллеры возвращают искаженные данные при нормальном выполнении этой инструкции, но злоумышленники могут использовать сбои адресной шины для получения правильных байтов и побайтового дампа прошивки.

MOV DPTR,#data16 – Загрузить 16-битную константу в указатель данных

Data: 16-битная константа (0000h до FFFFh)
 DPTR: 16-битный указатель данных (DPH + DPL)

Описание: Инструкция загружает 16-битную константу в DPTR. Старший байт сохраняется в DPH, младший — в DPL.

Синтаксис: MOV DPTR,#data;
Количество байт: 3 (байт кода операции, два байта данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOV DPTR,#X16

После выполнения: DPH=12h, DPL=34h

MOVX A,@Ri – Прочитать байт внешней RAM с 8-битным адресом

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция читает байт из внешней RAM по адресу, хранящемуся в Ri, и сохраняет его в аккумулятор.

Синтаксис: MOVX A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOVX A,@Ri

Адрес внешней RAM: SUM=12h, R0=12h
До выполнения: SUM=58h
После выполнения: A=58h

Примечание: Внешняя RAM обычно не зашифрована и уязвима для перехвата шины, что позволяет злоумышленникам захватывать конфиденциальные данные.

MOVC A,@A+PC – Прочитать байт памяти кода по адресу A+PC

A: Регистр аккумулятора
 PC: 16-битный счетчик программ

Описание: Инструкция вычисляет сумму PC и A, затем читает байт из программной памяти по полученному адресу и сохраняет его в аккумулятор.

Синтаксис: MOVC A,@A+PC;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOVC A,@A+PC

После выполнения подпрограммы "Table":
A=0 -> A=66h
A=1 -> A=77h
A=2 -> A=88h
A=3 -> A=99h

Примечание: DB (Define Byte) — директива ассемблера для определения констант.

Этот дополнительный код операции чтения программной памяти имеет те же векторы эксплуатации, что и вариант на основе DPTR. Сбои тактовой частоты или напряжения могут позволить полностью дампить Flash-память.

MOVX @Ri,A – Записать байт во внешнюю RAM с 8-битным адресом

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция записывает значение аккумулятора во внешнюю RAM по адресу, хранящемуся в Ri.

Синтаксис: MOVX @Ri,A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOVX @Ri,A

Адрес внешней RAM: SUM=34h, R1=34h
До выполнения: A=58h
После выполнения: SUM=58h

MOVX A,@DPTR – Прочитать байт внешней RAM с 16-битным адресом

A: Регистр аккумулятора
 DPTR: 16-битный указатель данных

Описание: Инструкция читает байт из внешней RAM по 16-битному адресу, хранящемуся в DPTR, и сохраняет его в аккумулятор.

Синтаксис: MOVX A,@DPTR;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOVX A,@DPTR

Адрес внешней RAM: SUM=1234h, DPTR=1234h
До выполнения: SUM=58h
После выполнения: A=58h

MUL AB – Умножить аккумулятор на регистр B

A: Регистр аккумулятора
 B: Регистр B

Описание: Инструкция умножает беззнаковые 8-битные значения A и B. Младший байт результата сохраняется в A, старший — в B. Флаг OV устанавливается, если результат > 255.

Синтаксис: MUL AB;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: OV;

ПРИМЕР:

MUL AB

До выполнения: A=50h (80), B=A0h (160)
После выполнения: A=00h, B=32h (12800 = 0x3200)

MOVX @DPTR,A – Записать байт во внешнюю RAM с 16-битным адресом

A: Регистр аккумулятора
 DPTR: 16-битный указатель данных

Описание: Инструкция записывает значение аккумулятора во внешнюю RAM по 16-битному адресу, хранящемуся в DPTR.

Синтаксис: MOVX @DPTR,A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

MOVX @DPTR,A

Адрес внешней RAM: SUM=1234h, DPTR=1234h
До выполнения: A=58h
После выполнения: SUM=58h

ORL A,Rn – Побитовое ИЛИ рабочего регистра с аккумулятором

Rn: Рабочий регистр от R0 до R7
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию ИЛИ между аккумулятором и рабочим регистром Rn. Результат сохраняется в аккумуляторе.

Синтаксис: ORL A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ORL A,Rn

До выполнения: A=C3h (11000011), R5=55h (01010101)
После выполнения: A=D7h (11010111)

NOP – Нет операции

Описание: Инструкция не выполняет никаких операций, используется для создания задержек.

Синтаксис: NOP;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

NOP

Последовательность генерирует отрицательный импульс длительностью 5 машинных циклов на выводе P2.3. При 12 МГц каждый цикл = 1 мкс, длительность импульса = 5 мкс.

ORL A,@Ri – Побитовое ИЛИ байта косвенной RAM с аккумулятором

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию ИЛИ между аккумулятором и байтом внутренней RAM, адрес которого хранится в Ri. Результат сохраняется в аккумуляторе.

Синтаксис: ORL A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ORL A,@Ri

Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: A=D6h (11010110)

ORL A,direct – Побитовое ИЛИ байта с прямым адресом с аккумулятором

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию ИЛИ между аккумулятором и байтом по прямому адресу. Результат сохраняется в аккумуляторе.

Синтаксис: ORL A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ORL A,Rx

До выполнения: A=C2h (11000010), LOG=54h (01010100)
После выполнения: A=D6h (11010110)

ORL direct,A – Побитовое ИЛИ прямого байта с аккумулятором, результат в прямом байте

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию ИЛИ между байтом по прямому адресу и аккумулятором. Результат сохраняется по прямому адресу.

Синтаксис: ORL direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ORL Rx,A

До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: TEMP=D6h (11010110)

ORL A,#data – Побитовое ИЛИ непосредственной константы с аккумулятором

Data: 8-битная константа (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию ИЛИ между аккумулятором и непосредственной константой. Результат сохраняется в аккумуляторе.

Синтаксис: ORL A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ORL A,#X

До выполнения: A=C2h (11000010)
После выполнения: A=C3h (11000011)

ORL C,bit – Побитовое ИЛИ бита с флагом переноса, результат в C

C: Флаг переноса
 Bit: Битово-адресуемая ячейка

Описание: Инструкция выполняет побитовую операцию ИЛИ между флагом переноса C и указанным битом. Результат сохраняется в C.

Синтаксис: ORL C,bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: C обновляется;

ПРИМЕР:

ORL C,bit

До выполнения: ACC=C6h (11000110), C=0
После выполнения: C=1

ORL direct,#data – Побитовое ИЛИ непосредственной константы с прямым байтом

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 Data: 8-битная константа (00h до FFh)

Описание: Инструкция выполняет побитовую операцию ИЛИ между байтом по прямому адресу и непосредственной константой. Результат сохраняется по прямому адресу.

Синтаксис: ORL direct,#data;
Количество байт: 3 (байт кода операции, байт адреса, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

ORL Rx,#X

До выполнения: TEMP=C2h (11000010)
После выполнения: TEMP=D2h (11010010)

POP direct – Извлечь значение из стека в прямой байт

Direct: Регистр с адресом от 0 до 255 (00h до FFh)

Описание: Инструкция извлекает значение из вершины стека и сохраняет его в байт по прямому адресу. Указатель стека уменьшается на 1.

Синтаксис: POP direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

POP Rx

До выполнения: SP=32h, стек содержит 01h,23h,20h
После выполнения: DPTR=0123h, SP=30h

ORL C,/bit – Побитовое ИЛИ инвертированного бита с флагом переноса

C: Флаг переноса
 Bit: Битово-адресуемая ячейка

Описание: Инструкция выполняет побитовую операцию ИЛИ между флагом переноса C и инвертированным значением указанного бита. Результат сохраняется в C.

Синтаксис: ORL C,/bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: C обновляется;

ПРИМЕР:

ORL C,/bit

До выполнения: ACC=C6h (11000110), C=0
После выполнения: C=0

RET – Возврат из подпрограммы

Описание: Инструкция завершает выполнение подпрограммы и возвращает управление в точку вызова.

Синтаксис: RET;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

RET

PUSH direct – Поместить прямой байт в стек

Direct: Регистр с адресом от 0 до 255 (00h до FFh)

Описание: Инструкция увеличивает указатель стека на 1 и сохраняет значение байта по прямому адресу в стек.

Синтаксис: PUSH direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

PUSH Rx

До выполнения: SP=30h, стек содержит 20h
После выполнения: SP=32h, стек содержит 20h,23h,01h

RL A – Циклический сдвиг аккумулятора влево

A: Регистр аккумулятора

Описание: Инструкция выполняет циклический сдвиг битов аккумулятора на одну позицию влево. Бит 7 переходит в бит 0.

Синтаксис: RL A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

RL A

До выполнения: A=C2h (11000010)
После выполнения: A=85h (10000101)

RL A

RETI – Возврат из прерывания

Описание: Инструкция завершает обработку прерывания и возвращает управление в точку прерывания. PSW не восстанавливается автоматически.

Синтаксис: RETI;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

RR A – Циклический сдвиг аккумулятора вправо

A: Регистр аккумулятора

Описание: Инструкция выполняет циклический сдвиг битов аккумулятора на одну позицию вправо. Бит 0 переходит в бит 7.

Синтаксис: RR A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

RR A

До выполнения: A=C2h (11000010)
После выполнения: A=61h (01100001)

Rotate Right

RLC A – Циклический сдвиг аккумулятора влево через перенос

A: Регистр аккумулятора

Описание: Инструкция выполняет циклический сдвиг 9-битной комбинации (A + C) влево. Бит 7 переходит в C, C переходит в бит 0.

Синтаксис: RLC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C обновляется;

ПРИМЕР:

RLC A

До выполнения: A=C2h (11000010), C=0
После выполнения: A=84h (10000100), C=1

Rotate Left Through Carry Bit

SETB C – Установить флаг переноса в 1

C: Флаг переноса

Описание: Инструкция устанавливает флаг переноса C в 1.

Синтаксис: SETB C;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C=1;

ПРИМЕР:

SETB C

После выполнения: C=1

Изменение флага переноса (SETB C / CLR C) используется для управления условными переходами (JC / JNC). В атаках на аппаратное обеспечение сбои напряжения или тактовой частоты могут изменить флаг переноса во время выполнения условных переходов, что позволяет обойти логику проверки безопасности.

RRC A – Циклический сдвиг аккумулятора вправо через перенос

A: Регистр аккумулятора

Описание: Инструкция выполняет циклический сдвиг 9-битной комбинации (A + C) вправо. Бит 0 переходит в C, C переходит в бит 7.

Синтаксис: RRC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C обновляется;

ПРИМЕР:

RRC A

До выполнения: A=C2h (11000010), C=0
После выполнения: A=61h (01100001), C=0

Rotate Right Through Carry Bit

SJMP rel – Короткий относительный переход

rel: Относительное смещение

Описание: Инструкция выполняет безусловный переход на адрес, вычисленный как текущий PC + смещение (диапазон -128..+127).

Синтаксис: SJMP rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

SJMP rel

До выполнения: PC=323
После выполнения: PC=345

SETB bit – Установить бит в 1

Bit: Битово-адресуемая ячейка

Описание: Инструкция устанавливает указанный бит в 1.

Синтаксис: SETB bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

SETB bit

До выполнения: P0.1=34h (00110100) — вывод настроен как выход
После выполнения: P0.1=35h (00110101) — вывод настроен как вход

Инструкция SETB bit является обратной к CLR bit. Она может создавать уязвимости, если используется для изменения битов блокировки, однако большинство МК 8051 имеют аппаратные ограничения, блокирующие запись в биты блокировки.

SUBB A,direct – Вычесть прямой байт из аккумулятора с займом

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция вычитает байт по прямому адресу и флаг займа C из аккумулятора. Результат сохраняется в аккумуляторе. C устанавливается при займе.

Синтаксис: SUBB A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

SUBB A,Rx

До выполнения: A=C9h, DIF=53h, C=0
После выполнения: A=76h, C=0

SUBB A,Rn – Вычесть рабочий регистр из аккумулятора с займом

Rn: Рабочий регистр от R0 до R7
 A: Регистр аккумулятора

Описание: Инструкция вычитает значение рабочего регистра Rn и флаг займа C из аккумулятора. Результат сохраняется в аккумуляторе.

Синтаксис: SUBB A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

SUBB A,Rn

До выполнения: A=C9h, R4=54h, C=1
После выполнения: A=74h, C=0

Примечание: Результат отличается от C9-54=75 из-за учета флага займа C=1.

SUBB A,#data – Вычесть непосредственную константу из аккумулятора с займом

A: Регистр аккумулятора
 Data: 8-битная константа (00h до FFh)

Описание: Инструкция вычитает непосредственную константу и флаг займа C из аккумулятора. Результат сохраняется в аккумуляторе.

Синтаксис: SUBB A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

SUBB A,#X

До выполнения: A=C9h, C=0
После выполнения: A=A7h, C=0

SUBB A,@Ri – Вычесть байт косвенной RAM из аккумулятора с займом

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция вычитает байт внутренней RAM, адрес которого хранится в Ri, и флаг займа C из аккумулятора. Результат сохраняется в аккумуляторе.

Синтаксис: SUBB A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C, OV, AC;

ПРИМЕР:

SUBB A,@Ri

Адрес RAM: MIN=F4h, R1=F4h
До выполнения: A=C9h, MIN=04h, C=0
После выполнения: A=C5h, C=0

XCH A,Rn – Обменять аккумулятор и рабочий регистр

Rn: Рабочий регистр от R0 до R7
 A: Регистр аккумулятора

Описание: Инструкция обменивает значения аккумулятора и рабочего регистра Rn.

Синтаксис: XCH A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XCH A,Rn

До выполнения: A=C6h, R3=29h
После выполнения: R3=C6h, A=29h

SWAP A – Обменять полубайты в аккумуляторе

A: Регистр аккумулятора

Описание: Инструкция обменивает местами старший и младший полубайты аккумулятора.

Синтаксис: SWAP A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

SWAP A

До выполнения: A=E1h (11100001)
После выполнения: A=1Eh (00011110)

Swap nibbles

XCH A,@Ri – Обменять аккумулятор и байт косвенной RAM

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция обменивает значения аккумулятора и байта внутренней RAM, адрес которого хранится в Ri.

Синтаксис: XCH A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XCH A,@Ri

Адрес RAM: SUM=E3h, R0=E3h
До выполнения: SUM=29h, A=98h
После выполнения: A=29h, SUM=98h

XCH A,direct – Обменять аккумулятор и прямой байт

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция обменивает значения аккумулятора и байта по прямому адресу.

Синтаксис: XCH A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XCH A,Rx

До выполнения: A=FFh, SUM=29h
После выполнения: SUM=FFh, A=29h

XRL A,Rn – Побитовое исключающее ИЛИ рабочего регистра с аккумулятором

Rn: Рабочий регистр от R0 до R7
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию XOR между аккумулятором и рабочим регистром Rn. Результат сохраняется в аккумуляторе.

Синтаксис: XRL A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XRL A,Rn

До выполнения: A=C3h (11000011), R3=55h (01010101)
После выполнения: A=96h (10010110)

XCHD A,@Ri – Обменять младшие полубайты аккумулятора и косвенной RAM

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция обменивает младшие полубайты аккумулятора и байта внутренней RAM, адрес которого хранится в Ri. Старшие полубайты не изменяются.

Синтаксис: XCHD A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XCHD A,@Ri

Адрес RAM: SUM=E3h, R0=E3h
До выполнения: SUM=29h, A=A8h
После выполнения: A=A9h, SUM=28h

Exchange low nibbles

XRL A,@Ri – Побитовое исключающее ИЛИ байта косвенной RAM с аккумулятором

Ri: Регистр косвенной адресации R0 или R1
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию XOR между аккумулятором и байтом внутренней RAM, адрес которого хранится в Ri. Результат сохраняется в аккумуляторе.

Синтаксис: XRL A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XRL A,@Ri

Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: A=96h (10010110)

XRL A,direct – Побитовое исключающее ИЛИ байта с прямым адресом с аккумулятором

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию XOR между аккумулятором и байтом по прямому адресу. Результат сохраняется в аккумуляторе.

Синтаксис: XRL A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XRL A,Rx

До выполнения: A=C2h (11000010), LOG=54h (01010100)
После выполнения: A=96h (10010110)

XRL direct,A – Побитовое исключающее ИЛИ прямого байта с аккумулятором, результат в прямом байте

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию XOR между байтом по прямому адресу и аккумулятором. Результат сохраняется по прямому адресу.

Синтаксис: XRL direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XRL Rx,A

До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: TEMP=96h (10010110)

XRL A,#data – Побитовое исключающее ИЛИ непосредственной константы с аккумулятором

Data: 8-битная константа (00h до FFh)
 A: Регистр аккумулятора

Описание: Инструкция выполняет побитовую операцию XOR между аккумулятором и непосредственной константой. Результат сохраняется в аккумуляторе.

Синтаксис: XRL A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XRL A,#X

До выполнения: A=C2h (11000010), X=11h (00010001)
После выполнения: A=D3h (11010011)

XRL direct,#data – Побитовое исключающее ИЛИ прямого байта с непосредственной константой

Direct: Регистр с адресом от 0 до 255 (00h до FFh)
 Data: 8-битная константа (00h до FFh)

Описание: Инструкция выполняет побитовую операцию XOR между байтом по прямому адресу и непосредственной константой. Результат сохраняется по прямому адресу.

Синтаксис: XRL direct,#data;
Количество байт: 3 (байт кода операции, байт адреса, байт данных);
Затронутые флаги PSW: Не изменяет флаги;

ПРИМЕР:

XRL Rx,#X

До выполнения: TEMP=C2h (11000010), X=12h (00010010)
После выполнения: TEMP=D0h (11010000)

 

Глава 4: Микроконтроллер AT89S8253

Введение

Более двух десятилетий прошло с момента выпуска оригинального ядра микроконтроллера 8051. За это время архитектура претерпела обширные итеративные обновления и функциональные улучшения. Сегодня десятки производителей полупроводников по всему миру выпускают совместимые производные микроконтроллеры под различными номерами. Современные обновленные версии предлагают значительно расширенные наборы функций по сравнению с исходной базовой конструкцией 8051. Большинство таких производных имеют маркировку «совместимый с 8051», «соответствует 8051» или «семейство 8051», чтобы подчеркнуть общее архитектурное происхождение. Эти обозначения означают идентичные архитектуры ядер ЦП и единые модели программирования с использованием стандартной системы команд 8051. В практических рабочих процессах разработки владение одним устройством в этом семействе позволяет легко перейти на любую другую совместимую модель, предоставляя инженерам доступ к сотням различных микроконтроллеров.

В этой главе основное внимание уделяется микроконтроллеру AT89S8253 производства Atman как представителю семейства. Это конкретное устройство было выбрано для детального анализа из-за его широкого промышленного применения, низкой стоимости и встроенной Flash-памяти программ. Характеристика Flash-памяти делает его идеальным для прототипирования и итеративного тестирования, поскольку образы программ можно многократно стирать и перепрограммировать тысячи раз. Кроме того, встроенный интерфейс последовательного программирования SPI позволяет перепрограммировать прошивку даже после того, как микросхема постоянно впаяна в готовые печатные платы.

Однако это удобное внутрисхемное программирование создает критические риски для безопасности прошивки. Если аппаратные биты блокировки устройства не запрограммированы, полное содержимое Flash-памяти программ может быть считано через интерфейс SPI. Atmel интегрировал трехуровневый механизм блокировки программной памяти для блокировки несанкционированного извлечения прошивки. Тем не менее, аппаратные предохранители безопасности не являются неуязвимыми для обхода. Злоумышленники успешно применяли атаки с декапсуляцией чипа и микрозондированием для обхода защиты битов блокировки и восстановления полных двоичных образов прошивки. В определенных сценариях эксплуатации раздел EEPROM на кристалле, который хранит конфиденциальные калибровочные параметры, серийные идентификаторы и криптографические ключи, может быть полностью считан с помощью инструкции MOVX, когда установлен бит управления EEMEN. Эта внутренняя уязвимость подчеркивает необходимость для разработчиков встраиваемых систем полностью понимать собственные механизмы безопасности AT89S8253 при проектировании продуктов, требующих надежной конфиденциальности и целостности прошивки.

AT89S8253 также интегрирует аппаратный модуль сторожевого таймера, который можно настроить для обнаружения событий вмешательства и немедленного полного сброса системы. Правильная конфигурация сторожевого таймера служит контрмерой против извлечения: если злоумышленник пытается остановить выполнение ЦП для зондирования шины или дампа памяти, тайм-аут сторожевого таймера вызовет сброс устройства и прервет попытки восстановления данных. Однако злоумышленники могут использовать атаки сбоями тактовой частоты или прямое манипулирование регистрами SFR управления сторожевого таймера, чтобы отключить таймер, если эти регистры остаются незащищенными битами блокировки. Совместное использование битов блокировки и логики сброса сторожевого таймера создает многоуровневый аппаратный барьер безопасности, который повышает сложность и стоимость клонирования устройств и обратного проектирования. Как видно на всех микроконтроллерах семейства 8051, ни один отдельный аппаратный примитив безопасности не обеспечивает абсолютной защиты. Полное восстановление прошивки обычно требует комбинирования нескольких методов атак, включая электромагнитный анализ побочных каналов, сбои напряжения/частоты и полную декапсуляцию кремния для доступа к внутренним предохранителям безопасности и ячейкам памяти. Как средства защиты встраиваемых систем, так и методы вредоносного извлечения продолжают развиваться вместе с промышленным развертыванием микроконтроллеров.

4.1 Спецификации идентификации микроконтроллера AT89S8253

  • Полная совместимость с системой команд классического ядра 8051.
  • 12 килобайт внутрисхемно программируемой Flash-памяти программ.
    • Двоичные образы прошивки загружаются через встроенный интерфейс SPI.
    • Flash-память поддерживает до 1000 циклов стирания и записи.
  • 2 килобайта энергонезависимой EEPROM-памяти данных на кристалле.
  • Диапазон рабочего напряжения питания: от 4 В до 6 В постоянного тока.
  • Поддерживаемая частота внешнего генератора: от 0 МГц до 24 МГц.
  • 256 байт энергозависимой внутренней RAM для хранения переменных времени выполнения.
  • 32 вывода общего назначения, сгруппированных в четыре 8-битных порта.
  • Три независимых 16-битных таймера/счетчика.
  • Девять источников аппаратных прерываний.
  • Два дополнительных режима пониженного энергопотребления: режим Idle и режим Power-Down.
  • Конфигурируемый аппаратный UART для асинхронной последовательной связи.
  • Встроенный программируемый сторожевой таймер.
  • Трехуровневая система защиты битами блокировки программной памяти.
Обзор AT89S8253

Кристалл AT89S8253 доступен в трех стандартных корпусах:

DIP корпус TQFP корпус PLCC корпус

Фактор формы физического корпуса напрямую влияет на сложность деструктивных атак декапсуляции. Более крупные корпуса с увеличенной площадью открытого кремния (такие как DIP и PLCC) значительно легче поддаются вскрытию и микрозондированию, чем компактные корпуса TQFP для поверхностного монтажа. Независимо от варианта корпуса, биты блокировки остаются основной линией защиты от внешнего дампа прошивки через интерфейс программирования. Лучшие практики предписывают программировать наивысший доступный уровень безопасности для отключения всех команд обратного чтения SPI. Многие команды разработчиков дополнительно защищают устройства, постоянно отключая цепи выводов SPI после массового производства, чтобы повысить барьер для несанкционированных попыток извлечения прошивки.

4.2 Функциональные описания выводов

VCC Основной вход питания (4 В ... 6 В постоянного тока).

GND Общий вывод земли.

Port 0 (P0.0–P0.7) В режиме вывода каждый вывод может управлять до 8 нагрузками TTL. В режиме ввода выводы имеют высокоимпедансное состояние. При использовании внешней памяти Port 0 служит мультиплексированной шиной адреса/данных.

Port 1 (P1.0–P1.7) В режиме вывода каждый вывод может управлять до 4 нагрузками TTL. В режиме ввода имеют внутренние подтягивающие резисторы к VCC. Каждый вывод Port 1 имеет дополнительные альтернативные функции:

Вывод порта Альтернативная функция
P1.0 T2 (внешний вход счетчика Timer 2)
P1.1 T2EX (внешний вход управления Timer 2)
P1.4 SS (сигнал выбора ведомого SPI)
P1.5 MOSI (данные SPI мастер-выход / ведомый-вход)
P1.6 MISO (данные SPI мастер-вход / ведомый-выход)
P1.7 SCK (сигнал тактовой частоты SPI)

Port 2 (P2.0–P2.7) Электрические характеристики аналогичны Port 1. При использовании внешней памяти Port 2 выдает старший байт 16-битного адреса (A8–A15).

Port 3 (P3.0–P3.7) Имеет такие же функции, как Port 1, и дополнительные альтернативные функции:

Вывод порта Альтернативная функция
P3.0 RXD (вход UART)
P3.1 TXD (выход UART)
P3.2 INT0 (внешнее прерывание 0)
P3.3 INT1 (внешнее прерывание 1)
P3.4 T0 (вход счетчика Timer 0)
P3.5 T1 (вход счетчика Timer 1)
P3.6 WR (сигнал записи внешней памяти)
P3.7 RD (сигнал чтения внешней памяти)

RST Высокий уровень на этом выводе вызывает полный аппаратный сброс.

ALE/PROG В обычном режиме генерирует импульсы частотой 1/16 от частоты генератора. При работе с внешней памятью используется для стробирования младшего байта адреса. При программировании Flash служит управляющим входом.

PSEN Сигнал строба чтения внешней программной памяти.

EA/VPP Подключение к земле заставляет ЦП читать инструкции из внешней памяти. Для использования внутренней Flash этот вывод должен быть подключен к VCC. При программировании Flash на этот вывод подается +12 В.

XTAL 1 Вход кварцевого генератора.

XTAL 2 Выход кварцевого генератора.

4.3 Архитектура памяти микроконтроллера AT89S8253

Программная память (Flash ROM)

Банк программной памяти объемом 12 КБ реализован на технологии Flash с плавающим затвором, что позволяет многократно стирать и перепрограммировать прошивку. Запись двоичных образов выполняется через интерфейс SPI. Поддерживается расширение внешней программной памятью, но 12 КБ достаточно для большинства приложений.

С точки зрения безопасности, Flash-память программ является основной целью для несанкционированного восстановления прошивки. Правильно запрограммированные биты блокировки блокируют внешние команды чтения через SPI. Однако физический доступ к чипу позволяет проводить дорогостоящие, но проверенные атаки декапсуляции, которые снимают защитное покрытие для доступа к кремниевому кристаллу и микрозондирования ячеек Flash. Для смягчения этого вектора атак Atmel реализовал трехуровневую систему блокировки, но все аппаратные предохранители остаются уязвимыми для продвинутого лабораторного оборудования.

Оперативная память (RAM)

Внутреннее пространство RAM разделено на три блока по 128 байт:

  • 128 байт для переменных времени выполнения;
  • 128 адресов, зарезервированных для SFR;
  • Дополнительные 128 байт RAM общего назначения, доступные только через косвенную адресацию.
RAM Memory

EEPROM

EEPROM — это энергонезависимая память, сочетающая гибкость RAM и сохранность данных ROM. AT89S8253 имеет 2 КБ (2048 байт) EEPROM.

EEPROM обычно используется для хранения серийных номеров, калибровочных коэффициентов и криптографических ключей. Успешное считывание EEPROM раскрывает все конфиденциальные данные. Биты блокировки также ограничивают чтение EEPROM через SPI, но она уязвима для электромагнитного анализа и сбоев напряжения. В некоторых сценариях полный дамп EEPROM возможен с использованием MOVX при установленном бите EEMEN в EECON.

Расширение внешней памяти

Все правила расширения внешней памяти для базового 8051 полностью применимы к AT89S8253. Можно расширять как программную, так и data-память до 64 КБ каждая.

Режимы адресации

  • Прямая адресация (MOV A,30h);
  • Косвенная адресация (MOV A,@R0).

Понимание этих режимов критично для безопасности. Косвенная адресация может быть использована для доступа к защищенным областям памяти, если злоумышленник может изменить значение указателя в R0/R1.

4.4 Специальные функциональные регистры (SFR)

AT89S8253 имеет 40 SFR. 22 основных регистра сохранены для совместимости, остальные добавлены для управления расширенной периферией.

SFRs

Наиболее важным для безопасности является EECON, управляющий доступом к EEPROM. Установка бита EEMEN позволяет полностью дампить EEPROM с помощью MOVX, обходя биты блокировки. Это известная уязвимость многих производных 8051. WDTCON управляет стороженым таймером, но может быть отключен сбоями или прямыми записями, если не защищен битами блокировки.

Аккумулятор (ACC / A)

Стандартный 8-битный регистр ядра 8051.

ACC

Регистр B

Стандартный регистр ядра, используется для умножения и деления.

B register

PSW (Program Status Word)

Стандартный регистр флагов ядра 8051.

PSW

SP (Stack Pointer)

Стандартный указатель стека ядра 8051.

SP

Порты P0, P1, P2, P3

Стандартные регистры портов ввода-вывода ядра 8051.

Ports P0-P3

Рабочие регистры R0–R7

Стандартные регистры ядра 8051.

R registers

AUXR (Auxiliary Control Register)

Содержит два управляющих бита:

AUXR
  • DISALE – управляет выводом ALE.
  • Intel_Pwd_Exit – управляет пробуждением из Power-Down.

CLKREG (Clock Multiplier)

CLKREG
  • 0 – деление частоты на 2.
  • 1 – прямое использование частоты генератора.

Указатели данных

DPTR — это 16-битный указатель, состоящий из DPH и DPL. Бит DPS в EECON выбирает активный указатель.

DPS=0 – активен DPTR0.

Data Pointers 0

DPS=1 – активен DPTR1.

Data Pointers 1

Переключение указателей может быть использовано для доступа к защищенным областям памяти, включая биты блокировки.

Работа с EEPROM

EEPROM объемом 2 КБ используется для хранения данных, сохраняющихся при отключении питания. Управление осуществляется через EECON. Инструкция MOVX используется как для доступа к EEPROM, так и к внешней RAM в зависимости от бита EEMEN.

Handling EEPROM

Регистр EECON

EECON

WRTINH – блокировка записи при низком напряжении (только чтение).

RDY/BSY – флаг готовности/занятости.

DPS – выбор активного указателя данных.

EEMEN – выбор между EEPROM и внешней RAM для MOVX.

  • 0 – MOVX обращается к внешней RAM.
  • 1 – MOVX обращается к EEPROM.

Бит EEMEN является основным вектором атак для несанкционированного дампа EEPROM. Если злоумышленник может установить этот бит, он может считать все содержимое EEPROM, включая ключи и серийные номера.

EEMWE – разрешает запись в EEPROM.

EELD – включает буферизованную запись по 32 байта для ускорения программирования.

4.5 Сторожевой таймер (WDT)

Сторожевой таймер питается от основного генератора. По умолчанию отключен, останавливается в режиме Power-Down. При переполнении вызывает сброс. Управляется через WDTCON.

Три бита PS2, PS1, PS0 задают время переполнения (при 12 МГц):

Биты предделителя Время
PS2 PS1 PS0
0 0 0 16 мс
0 0 1 32 мс
0 1 0 64 мс
0 1 1 128 мс
1 0 0 256 мс
1 0 1 512 мс
1 1 0 1024 мс
1 1 1 2048 мс

WDTCON

WDTCON

PS2,PS1,PS0 – выбор времени переполнения.

WDIDLE – работа сторожевого таймера в режиме Idle.

DISRTO – разрешает вывод сигнала сброса на вывод RST.

HWDT – аппаратный/программный режим.

  • 0 – программный режим.
  • 1 – аппаратный режим; включение последовательностью 0x1E, 0xE1 в WDTRST.

WSWRST – сброс сторожевого таймера.

WDTEN – включение сторожевого таймера.

Сторожевой таймер служит защитой от дампа памяти: попытка остановить ЦП вызывает сброс. Рекомендуется использовать аппаратный режим с коротким таймаутом.

4.6 Прерывания

AT89S8253 имеет шесть источников прерываний. Каждый может быть включен/отключен через IE (Interrupt Enable). Глобальное разрешение управляется битом EA.

Interrupts

IE (Interrupt Enable)

IE

EA – глобальное разрешение прерываний.

ET2 – разрешение прерывания Timer 2.

ES – разрешение последовательных прерываний (UART/SPI).

ET1 – разрешение прерывания Timer 1.

EX1 – разрешение внешнего прерывания INT1.

ET0 – разрешение прерывания Timer 0.

EX0 – разрешение внешнего прерывания INT0.

Прерывания могут использоваться как контрмера против вмешательства.

Приоритеты прерываний

AT89S8253 имеет четыре уровня приоритета (0–3), настраиваемых через IP и IPH. Правила разрешения конфликтов:

  1. Сброс (высший приоритет).
  2. Уровень 3 (не может быть прерван, кроме сброса).
  3. Уровни 2, 1, 0 (могут быть прерваны более высоким приоритетом).

Если два прерывания одного приоритета возникают одновременно, используется фиксированный порядок:

  1. INT0
  2. Timer 0
  3. INT1
  4. Timer 1
  5. UART/SPI
  6. Timer 2

IP (Interrupt Priority)

IP

Устанавливает младший бит приоритета для каждого прерывания.

IPH (Interrupt Priority High)

IPH

Устанавливает старший бит приоритета. Комбинация IP и IPH дает уровень 0–3.

IP IPH Уровень
0 0 0 (низший)
0 1 1
1 0 2
1 1 3 (высший)

Обработка прерывания

  1. Завершить текущую инструкцию.
  2. Сохранить адрес возврата в стек.
  3. Загрузить вектор прерывания:
Источник Вектор
INT0 03h
Timer 0 0Bh
INT1 13h
Timer 1 1Bh
UART/SPI 23h
Timer 2 2Bh

4. В конце обработчика RETI восстанавливает адрес из стека.

4.7 Таймеры и счетчики

Таймеры T0 и T1

Полностью совместимы с классическим 8051.

Таймер T2

16-битный таймер/счетчик с дополнительными возможностями. Состоит из TH2, TL2 и регистров захвата/автоперезагрузки RCAP2H, RCAP2L.

Counter and Timer Registers

T2CON

T2CON

TF2 – флаг переполнения T2.

EXF2 – флаг внешнего события на T2EX.

RCLK – выбор источника тактов для приема UART.

TCLK – выбор источника тактов для передачи UART.

EXEN2 – разрешение внешнего управления T2EX.

TR2 – запуск T2.

C/T2 – выбор режима: таймер (0) или счетчик (1).

CP/RL2 – выбор режима: захват (1) или автоперезагрузка (0).

Режим захвата T2

При CP/RL2=1 и EXEN2=1 падение на T2EX копирует TH2/TL2 в RCAP2H/RCAP2L.

Capture mode

Режим автоперезагрузки T2

При CP/RL2=0 переполнение T2 копирует RCAP2H/RCAP2L в TH2/TL2.

Auto-reload

T2OE – разрешает вывод тактовой частоты на P1.0.

DCEN – разрешает двунаправленный счет.

T2 как генератор скорости передачи UART

При установке RCLK или TCLK T2 работает как генератор бод-рейта.

Baud Rate formula

T2 как генератор тактовой частоты

При T2OE=1 и C/T2=0 на P1.0 выдается меандр с частотой по формуле.

Frequency formula

4.8 UART

Полностью совместим с классическим 8051, четыре режима, выбор через SM0/SM1 в SCON.

SCON

Многопроцессорная связь

Режим SM2 в SCON включает аппаратную адресацию для многоузловых сетей. Используются регистры SADDR (адрес) и SADEN (маска).

SADDR and SADEN

4.9 SPI

Синхронный последовательный интерфейс для связи с периферией. Использует выводы: MOSI, MISO, SCK, SS.

SPI

SPI является основным интерфейсом программирования AT89S8253. Без битов блокировки позволяет полностью считать Flash.

Обычный режим SPI

Данные записываются в SPDR и передаются через сдвиговый регистр. После передачи устанавливается флаг SPIF.

Normal SPI

Расширенный режим SPI (с буфером)

Использует буфер для повышения пропускной способности.

Enhanced SPI

SPDR (Data Register)

SPDR

SPSR (Status Register)

SPSR

SPIF – флаг завершения передачи.

WCOL – флаг коллизии записи.

DISSO – отключение вывода MISO.

ENH – включение расширенного режима.

SPCR (Control Register)

SPCR

SPIE – разрешение прерываний SPI.

SPE – включение SPI.

DORD – порядок бит (0 – MSB first, 1 – LSB first).

MSTR – режим мастер/ведомый.

CPOL – полярность SCK.

CPHA – фаза SCK.

SPR1,SPR0 – скорость SCK в режиме мастера.

4.10 Управление энергопотреблением

Поддерживаются три режима: Normal (~25 мА), Idle (~6.5 мА), Power-Down (~40 мкА). Управление через PCON.

PCON

SMOD1 – удвоение скорости UART.

SMOD0 – выбор функции бита 7 SCON.

POF – флаг включения питания.

GF1, GF0 – пользовательские флаги.

PD – переход в Power-Down.

IDL – переход в Idle.

Типичные ошибки программирования

RAM — единое физическое пространство, разделение на банки и стек логическое. Необходимо правильно инициализировать SP (>20h).

SFR нельзя использовать как обычную RAM.

При использовании внешней памяти Port 0 и Port 2 становятся шинами.

DPTR состоит из DPH и DPL.

UART требует настройки таймера 1.

В обработчиках прерываний необходимо сохранять и восстанавливать контекст: PSW, DPTR, ACC, B, R0–R7. Использовать PUSH с абсолютными адресами (например, PUSH 00h).

Косвенная адресация через R0/R1 не работает с SFR.

Флаги TI и RI в SCON должны сбрасываться вручную.

Список битово-адресуемых SFR

Аккумулятор (адрес E0h):

ACC
Сброс 00000000
Бит --------
Адрес E7E6E5E4E3E2E1E0
  • Список обратного проектирования МК SyncMOS 8051 от Mikatech:
  • Серия F29Cxx взлом защиты микроконтроллера: F29C31004T F29C31004B F29C31400TF29LC51002F29LC51001F29LC51000 F29C51004T F29C51002T F29C51001T F29C51000T F29C51000B F29C51004T F29C51004B F29C51002T F29C51002B F29C51001T F29C51001BF29C61400T ...

    Серия S29Cxx взлом защиты прошивки контроллера: S29C31001B S29C31001T S29C31002B S29C31002T S29C31004B S29C31004T S29C51001B S29C51001T S29C51002B S29C51002T S29C51004B S29C51004T ...

    Серия MSUxx считывание защиты микроконтроллера: MSU1958 MSU2952 MSU2964 MSU2958 ...

    Серия SM29xx взлом защиты битов блокировки контроллера: SM2951 SM2952 SM2954 SM2958 SM2964 SM2965 ...

    Серия SM59xx считывание защиты битов блокировки микроконтроллера: SM59064 SM59128C SM59128L SM5912C SM5912L SM5916C SM59164 SM5916L SM59264 SM5964 SM5964A SM5964AC SM5964AL SM5964C SM5964D0 SM5964D0A SM5964D1A SM59D02G2C SM59D02G2L SM59D03G2C SM59D03G2L SM59D04G2C SM59D04G2L SM59R08A2 ...

    Серия SM59xx взлом защиты микроконтроллера: SM7908 SM79108 SM79164 SM79164L SM79164V SM7932 SM7964 ...

    Серия SM59xx взлом защиты битов блокировки контроллера: SM894051 SM8951 SM89516 SM89516A SM89516AL SM89516B SM89516BL SM89516L SM8951A SM8951AL SM8951B SM8951BL SM8951L SM8952 SM8952A SM8952AL SM8952B SM8952BL SM8952L SM8954 SM8954A SM8954AL SM8954B SM8954BL SM8954L SM8958 SM8958A SM8958AL SM8958B SM8958BL SM8958L SM89S16R1C SM89T04R1C SM89T04R1L SM89T08R1C SM89T08R1L SM89T16R1C SM89T16R1L ..

Общие вопросы об извлечении прошивок микроконтроллеров


  • Безопасно ли отправлять оплату в MikaTech?

    Если бы MikaTech была плохой компанией, в интернете можно было бы найти тонны негативных отзывов за 28 лет истории

    Итак, ответ: ДА! Мы хорошие люди.

    Почему выбирают Mikatech, нажмите здесь, чтобы узнать


  • Может ли Mikatech взломать микросхемы, не указанные на сайте?

    У разных производителей разные номера деталей, но внутреннее ядро микросхемы может быть изготовлено по одной технологии. Невозможно перечислить все номера деталей, к которым может применяться наша технология, например MYSON, STK, FEELING, ANALOG, FUJITSU, NOVATEK, LG/HYNDAI.

    Кроме того, с развитием технологий мы ежедневно накапливаем опыт и разрабатываем новые методы обратного проектирования для различных интегральных схем. Полный список номеров интегральных схем, входящих в нашу компетенцию, постоянно растет, пожалуйста, свяжитесь с нами для уточнения.

  • Будет ли защищена моя конфиденциальность?

    Mikatech Innovative Limited понимает важность конфиденциальности своих клиентов. В момент обращения в Mikatech ваша личная информация будет защищена нашими управленческими регламентами, разработанными за годы практики. Mikatech использует эту информацию для настройки своих услуг под вас и никогда не раскрывает ее третьим лицам по любой причине.
    По каждому проекту мы удаляем все данные, материалы и коды через 60 дней после передачи файлов, что защищает нас и вашу конфиденциальность.

  • Законно ли пользоваться услугами Mikatech?

    Да, это абсолютно законно.
    Mikatech предоставляет услуги обратного проектирования только в образовательных целях. Использование вышеуказанных услуг может быть незаконным в некоторых странах или регионах, проверьте местные законы. Mikatech не несет ответственности за использование услуг, которое может считаться незаконным.


  • Я отправил вам письмо, почему нет ответа?

    • A. Наш почтовый сервер временно вышел из строя, ваше сообщение не было доставлено, даже если отображается сообщение об успешной отправке, свяжитесь с нами снова.
    • B. Наш email распознается вашим почтовым сервером как спам, поэтому наш ответ был отклонен или помещен в спам-папку. Пожалуйста, удалите наш аккаунт из списка спама, проверьте спам-папку или используйте другой email (например, gmail).
    • C. Ваш email распознается нашим сервером как спам и был помещен в спам-папку, пожалуйста, используйте другой email для связи.



    Услуги по взлому МК


    время взлома МК

    Лет

    28 +
    страны взлома МК

    Стран

    110 +
    клиенты атак на МК

    Клиентов

    5000 +
    разблокированные проекты МК

    Проектов

    60000 +