Если бы MikaTech была плохой компанией, в интернете можно было бы найти тонны негативных отзывов за 28 лет истории
Итак, ответ: ДА! Мы хорошие люди.Почему выбирают Mikatech, нажмите здесь, чтобы узнать
О MikaTech
Время пролетело быстро, с того дня, как мы выполнили наш первый проект по обратному проектированию МК 8051 в 1998 году, до того дня, когда мы создали нашу лабораторию обратного проектирования стоимостью в миллион долларов в 2012 году, прошло 14 лет. Теперь мы начинаем наш новый бизнес по разработке встроенных систем визуализации, надеемся, что сможем прослужить еще 10 лет.
Peter Lee
Со-основатель и генеральный директор
Написание программ для микроконтроллеров в основном заключается в выдаче инструкций (команд) в определенной последовательности выполнения для выполнения поставленных задач. Электронное оборудование не может интерпретировать логику, понятную человеку, например: «Если кнопка нажата, включи свет». Вместо этого разработчики должны использовать серию простых, строго определенных команд, распознаваемых внутренним декодером МК. Полная коллекция этих допустимых команд известна как система команд. Все совместимые с 8051 микроконтроллеры имеют в общей сложности 255 различных инструкций, то есть 255 уникальных машинных слов, доступных для разработки программ.
На первый взгляд, запоминание этого большого набора символических кодов операций кажется устрашающим. Однако реальная нагрузка по обучению гораздо легче, чем кажется. Многие инструкции считаются отдельными записями, даже если они выполняют одинаковые базовые операции, оставляя только 111 функционально уникальных команд. Например, ADD A,R0, ADD A,R1, ..., ADD A,R7 — все выполняют одну и ту же операцию сложения между аккумулятором и рабочим регистром. Поскольку существует восемь рабочих регистров, каждый вариант указан как отдельная запись инструкции. Учитывая, что все инструкции реализуют только 53 основные операции (сложение, вычитание, копирование данных и т. д.) и большинство из них редко используются в реальных проектах, разработчикам нужно освоить всего около 20–30 мнемоник — это вполне приемлемое количество.
Помимо функционального выполнения программ, система команд формирует первую линию защиты от несанкционированного доступа к прошивке. Большинство встраиваемых систем полагаются на механизмы битов блокировки для предотвращения внешнего считывания внутренней Flash или EEPROM памяти. Тем не менее, полное понимание поведения каждой инструкции во время выполнения необходимо как для написания безопасной производственной прошивки, так и для проведения законного обратного проектирования для восстановления утерянного исходного кода. Злоумышленники часто используют определенные поведения инструкций для обхода защиты блокировки, используя инжекцию ошибок, анализ времени выполнения и другие методы анализа побочных каналов для активации состояния разблокировки. Во многих сценариях атак физическая декапсуляция чипа в сочетании с микрозондированием позволяет напрямую считывать состояния битов предохранителей, что дает возможность полного дампа двоичных данных хранящейся прошивки. Способность воспроизвести полную функциональность устройства часто зависит от успешного извлечения прошивки с помощью этих методов, что делает восстановление прошивки критически важным навыком в области исследований безопасности встраиваемых систем.
Все инструкции делятся на пять основных групп в зависимости от выполняемых операций:
Первый сегмент каждой инструкции называется мнемоникой, которая представляет основную операцию, которая должна быть выполнена (копирование данных, арифметическое сложение, побитовая логика и т. д.). Мнемоники являются сокращенными аббревиатурами для полного названия каждой аппаратной операции. Примеры определений показаны ниже:
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 оценивают для применения ограничений доступа к памяти. Эта стандартная последовательность проверки блокировки является основной целью для атак с инжекцией сбоев: искусственное изменение флага переноса обходит всю ветвь проверки безопасности. При физических атаках на основе декапсуляции чипа микрозондирование напрямую обращается к этим битовым ячейкам предохранителей для считывания сырых состояний битов блокировки, что позволяет выполнять полные дампы программной памяти без изменения какого-либо кода прошивки.
Ниже приведен справочный глоссарий, определяющий все стандартные обозначения операндов, используемые в системе команд 8051:
Эти обозначения операндов определяют полный спектр режимов адресации 8051 и необходимы для поиска адресов предохранителей блокировки в карте памяти чипа. Стандартный рабочий процесс обратного проектирования сканирует двоичную прошивку на наличие ссылок на прямые операнды, указывающие на адреса SFR безопасности, а затем отслеживает все пути инструкций чтения/записи, нацеленных на эти регистры. Этот статический анализ часто выявляет недокументированные заводские тестовые режимы или скрытые пути бэкдора, которые обеспечивают полное считывание памяти даже при активной защите битов блокировки. Для легальных проектов восстановления данных прошивки точное понимание каждого типа операндов позволяет точно восстанавливать структуру полных дампов памяти и правильно интерпретировать извлеченные двоичные файлы кода.
ACALL addr11 – Абсолютный вызов подпрограммы в пределах 2 КБ страницы
addr11: Адрес памяти подпрограммы (11-битное смещение страницы)
Описание: Этот код операции безусловно помещает адрес возврата счетчика программ в системный стек и переходит к выполнению по указанному адресу подпрограммы. Действует критическое ограничение: следующий байт текущей инструкции и точка входа в целевую подпрограмму должны находиться в пределах одной и той же 2 КБ границы страницы программной памяти.
Синтаксис: ACALL [метка_подпрограммы];
Байты инструкции: 2 (байт кода операции, 11-битный адрес);
Затронутые флаги PSW: Инструкция не изменяет флаги состояния.
ПРИМЕР:
Значение 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
Адрес 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;
ПРИМЕР:
До выполнения: A=45h
После выполнения: A=78h
ADDC A,Rn – Сложить регистр с аккумулятором с учетом флага переноса
Rn: Любой рабочий регистр от R0 до R7
A: Регистр аккумулятора
Описание: Инструкция складывает значение рабочего регистра и флаг переноса C с аккумулятором. Результат сохраняется в аккумуляторе. Флаг C устанавливается, если возникает перенос из старшего бита.
Синтаксис: ADDC A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C, OV, AC;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
Адрес 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;
ПРИМЕР:
До выполнения: A=C9h, C=1
После выполнения: A=DCh, C=0
AJMP addr11 – Абсолютный переход в пределах 2 КБ страницы
addr11: 11-битный адрес перехода
Описание: Код операции выполняет безусловный переход на указанный 11-битный адрес в пределах текущей 2 КБ страницы программной памяти.
Синтаксис: AJMP [метка];
Количество байт: 2 (байт кода операции, 11-битный адрес);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: PC=0123h
После выполнения: PC=0345h
ANL A,Rn – Побитовое И рабочего регистра с аккумулятором
Rn: Любой рабочий регистр от R0 до R7
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию И между аккумулятором и рабочим регистром Rn. Результат сохраняется в аккумуляторе.
Синтаксис: ANL A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C3h (11000011), R5=55h (01010101)
После выполнения: A=41h (01000001)
ANL A,direct – Побитовое И байта с прямым адресом с аккумулятором
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию И между аккумулятором и байтом по прямому адресу. Результат сохраняется в аккумуляторе.
Синтаксис: ANL A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C3h (11000011), LOG=55h (01010101)
После выполнения: A=41h (01000001)
ANL A,@Ri – Побитовое И байта косвенной RAM с аккумулятором
Ri: Регистр косвенной адресации R0 или R1
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию И между аккумулятором и байтом внутренней RAM, адрес которого хранится в Ri. Результат сохраняется в аккумуляторе.
Синтаксис: ANL A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C3h (11000011)
После выполнения: A=41h (01000001)
ANL direct,A – Побитовое И аккумулятора с байтом прямого адреса, сохранить результат в прямом байте
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию И между байтом по прямому адресу и аккумулятором. Результат сохраняется по прямому адресу.
Синтаксис: ANL direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=55h
После выполнения: Переход к LOOP, если TEMP != 33h
CLR A – Обнулить аккумулятор
A: Регистр аккумулятора
Описание: Инструкция устанавливает все биты аккумулятора в 0.
Синтаксис: CLR A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C3h
После выполнения: A=00h
CLR C – Сбросить флаг переноса
C: Флаг переноса
Описание: Инструкция устанавливает флаг переноса C в 0.
Синтаксис: CLR C;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C=0;
ПРИМЕР:
До выполнения: C=1
После выполнения: C=0
CLR bit – Сбросить битовую ячейку с прямым адресом
Bit: Битово-адресуемая ячейка
Описание: Инструкция устанавливает указанную битовую ячейку в 0.
Синтаксис: CLR bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: P0.1=1
После выполнения: P0.1=0
CPL A – Инвертировать аккумулятор
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую инверсию аккумулятора.
Синтаксис: CPL A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C3h (11000011)
После выполнения: A=3Ch (00111100)
CPL C – Инвертировать флаг переноса
C: Флаг переноса
Описание: Инструкция инвертирует состояние флага переноса C.
Синтаксис: CPL C;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C инвертируется;
ПРИМЕР:
До выполнения: C=0
После выполнения: C=1
CPL bit – Инвертировать битовую ячейку с прямым адресом
Bit: Битово-адресуемая ячейка
Описание: Инструкция инвертирует состояние указанной битовой ячейки.
Синтаксис: CPL bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: P0.1=0
После выполнения: P0.1=1
DA A – Десятичная коррекция аккумулятора
A: Регистр аккумулятора
Описание: Инструкция выполняет десятичную коррекцию аккумулятора после операций сложения для BCD-арифметики.
Синтаксис: DA A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C;
ПРИМЕР:
До выполнения: A=56h, C=0
После выполнения: A=62h, C=0
DEC A – Уменьшить аккумулятор на единицу
A: Регистр аккумулятора
Описание: Инструкция уменьшает значение аккумулятора на 1.
Синтаксис: DEC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=45h
После выполнения: A=44h
DEC Rn – Уменьшить рабочий регистр на единицу
Rn: Рабочий регистр от R0 до R7
Описание: Инструкция уменьшает значение рабочего регистра Rn на 1.
Синтаксис: DEC Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: R5=45h
После выполнения: R5=44h
DEC Rx – Уменьшить байт с прямым адресом на единицу
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
Описание: Инструкция уменьшает значение байта по прямому адресу на 1.
Синтаксис: DEC direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=45h
После выполнения: TEMP=44h
DEC @Ri – Уменьшить байт косвенной RAM на единицу
Ri: Регистр косвенной адресации R0 или R1
Описание: Инструкция уменьшает значение байта внутренней RAM, адрес которого хранится в Ri, на 1.
Синтаксис: DEC @Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес 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;
ПРИМЕР:
До выполнения: 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: R5=05h
После выполнения: R5=04h, переход к LOOP
DJNZ Rx,rel – Уменьшить байт прямого адреса и переход, если не ноль
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
rel: Относительное смещение
Описание: Инструкция уменьшает значение байта по прямому адресу на 1. Если результат не равен 0, выполняется переход по относительному адресу.
Синтаксис: DJNZ direct,rel;
Количество байт: 3 (байт кода операции, байт адреса, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=05h
После выполнения: TEMP=04h, переход к LOOP
INC A – Увеличить аккумулятор на единицу
A: Регистр аккумулятора
Описание: Инструкция увеличивает значение аккумулятора на 1.
Синтаксис: INC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=45h
После выполнения: A=46h
INC Rn – Увеличить рабочий регистр на единицу
Rn: Рабочий регистр от R0 до R7
Описание: Инструкция увеличивает значение рабочего регистра Rn на 1.
Синтаксис: INC Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: R5=45h
После выполнения: R5=46h
INC Rx – Увеличить байт с прямым адресом на единицу
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
Описание: Инструкция увеличивает значение байта по прямому адресу на 1.
Синтаксис: INC direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=45h
После выполнения: TEMP=46h
INC @Ri – Увеличить байт косвенной RAM на единицу
Ri: Регистр косвенной адресации R0 или R1
Описание: Инструкция увеличивает значение байта внутренней RAM, адрес которого хранится в Ri, на 1.
Синтаксис: INC @Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=45h
После выполнения: TEMP=46h
INC DPTR – Увеличить указатель данных на единицу
DPTR: 16-битный указатель данных
Описание: Инструкция увеличивает значение 16-битного указателя данных DPTR на 1.
Синтаксис: INC DPTR;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: DPTR=1234h
После выполнения: DPTR=1235h
JB bit,rel – Переход, если бит установлен
Bit: Битово-адресуемая ячейка
rel: Относительное смещение
Описание: Инструкция проверяет указанный бит. Если бит равен 1, выполняется переход по относительному адресу.
Синтаксис: JB bit,rel;
Количество байт: 3 (байт кода операции, байт адреса бита, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: P1.3=1
После выполнения: Переход к LABEL
JBC bit,rel – Переход, если бит установлен, затем сбросить бит
Bit: Битово-адресуемая ячейка
rel: Относительное смещение
Описание: Инструкция проверяет указанный бит. Если бит равен 1, выполняется переход по относительному адресу, а затем бит сбрасывается в 0.
Синтаксис: JBC bit,rel;
Количество байт: 3 (байт кода операции, байт адреса бита, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: P1.3=1
После выполнения: Переход к LABEL, P1.3=0
JC rel – Переход, если флаг переноса установлен
rel: Относительное смещение
Описание: Инструкция проверяет флаг переноса C. Если C=1, выполняется переход по относительному адресу.
Синтаксис: JC rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: C=1
После выполнения: Переход к LABEL
JMP @A+DPTR – Косвенный переход по адресу A+DPTR
A: Регистр аккумулятора
DPTR: 16-битный указатель данных
Описание: Инструкция выполняет переход на адрес, вычисленный как сумма аккумулятора и указателя данных DPTR.
Синтаксис: JMP @A+DPTR;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: DPTR=1000h, A=05h
После выполнения: Переход на адрес 1005h
JNC rel – Переход, если флаг переноса сброшен
rel: Относительное смещение
Описание: Инструкция проверяет флаг переноса C. Если C=0, выполняется переход по относительному адресу.
Синтаксис: JNC rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: C=0
После выполнения: Переход к LABEL
JNZ rel – Переход, если аккумулятор не равен нулю
rel: Относительное смещение
Описание: Инструкция проверяет аккумулятор. Если A != 0, выполняется переход по относительному адресу.
Синтаксис: JNZ rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=55h
После выполнения: Переход к LABEL
JZ rel – Переход, если аккумулятор равен нулю
rel: Относительное смещение
Описание: Инструкция проверяет аккумулятор. Если A = 0, выполняется переход по относительному адресу.
Синтаксис: JZ rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=00h
После выполнения: Переход к LABEL
LCALL addr16 – Длинный вызов подпрограммы
addr16: 16-битный адрес подпрограммы
Описание: Инструкция выполняет безусловный вызов подпрограммы по 16-битному адресу. Адрес возврата сохраняется в стеке.
Синтаксис: LCALL addr16;
Количество байт: 3 (байт кода операции, два байта адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: PC=0123h
После выполнения: Переход на адрес 3456h
LJMP addr16 – Длинный безусловный переход
addr16: 16-битный адрес перехода
Описание: Инструкция выполняет безусловный переход на 16-битный адрес.
Синтаксис: LJMP addr16;
Количество байт: 3 (байт кода операции, два байта адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: PC=0123h
После выполнения: Переход на адрес 3456h
MOV A,Rn – Скопировать рабочий регистр в аккумулятор
Rn: Рабочий регистр от R0 до R7
A: Регистр аккумулятора
Описание: Инструкция копирует значение рабочего регистра Rn в аккумулятор.
Синтаксис: MOV A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: R5=45h
После выполнения: A=45h
MOV A,direct – Скопировать байт с прямым адресом в аккумулятор
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция копирует байт по прямому адресу в аккумулятор.
Синтаксис: MOV A,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=45h
После выполнения: A=45h
MOV A,@Ri – Скопировать байт косвенной RAM в аккумулятор
Ri: Регистр косвенной адресации R0 или R1
A: Регистр аккумулятора
Описание: Инструкция копирует байт внутренней RAM, адрес которого хранится в Ri, в аккумулятор.
Синтаксис: MOV A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес RAM: TEMP=FAh, R1=FAh
До выполнения: TEMP=45h
После выполнения: A=45h
MOV A,#data – Загрузить непосредственную константу в аккумулятор
Data: 8-битная константа (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция загружает непосредственную константу в аккумулятор.
Синтаксис: MOV A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
После выполнения: A=45h
MOV Rn,A – Скопировать аккумулятор в рабочий регистр
A: Регистр аккумулятора
Rn: Рабочий регистр от R0 до R7
Описание: Инструкция копирует значение аккумулятора в рабочий регистр Rn.
Синтаксис: MOV Rn,A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=45h
После выполнения: R5=45h
MOV Rn,direct – Скопировать байт с прямым адресом в рабочий регистр
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
Rn: Рабочий регистр от R0 до R7
Описание: Инструкция копирует байт по прямому адресу в рабочий регистр Rn.
Синтаксис: MOV Rn,direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=45h
После выполнения: R5=45h
MOV Rn,#data – Загрузить непосредственную константу в рабочий регистр
Data: 8-битная константа (00h до FFh)
Rn: Рабочий регистр от R0 до R7
Описание: Инструкция загружает непосредственную константу в рабочий регистр Rn.
Синтаксис: MOV Rn,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
После выполнения: R5=45h
MOV direct,A – Скопировать аккумулятор в байт с прямым адресом
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция копирует значение аккумулятора в байт по прямому адресу.
Синтаксис: MOV direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=45h
После выполнения: TEMP=45h
MOV direct,Rn – Скопировать рабочий регистр в байт с прямым адресом
Rn: Рабочий регистр от R0 до R7
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
Описание: Инструкция копирует значение рабочего регистра Rn в байт по прямому адресу.
Синтаксис: MOV direct,Rn;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: R5=45h
После выполнения: TEMP=45h
MOV direct,direct – Скопировать байт с прямым адресом в байт с прямым адресом
Direct1: Регистр-источник с адресом от 0 до 255 (00h до FFh)
Direct2: Регистр-приемник с адресом от 0 до 255 (00h до FFh)
Описание: Инструкция копирует значение из одного байта с прямым адресом в другой. Исходное значение сохраняется.
Синтаксис: MOV direct1,direct2;
Количество байт: 3 (байт кода операции, два байта адресов);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=58h
После выполнения: TEMP=58h, SUM=58h
MOV @Ri,A – Скопировать аккумулятор в ячейку косвенной RAM
A: Регистр аккумулятора
Ri: Регистр косвенной адресации R0 или R1
Описание: Инструкция копирует значение аккумулятора в ячейку внутренней RAM, адрес которой хранится в Ri.
Синтаксис: MOV @Ri,A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес 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: Не изменяет флаги;
ПРИМЕР:
После выполнения: TEMP=22h
MOV @Ri,#data – Загрузить непосредственную константу в ячейку косвенной RAM
Ri: Регистр косвенной адресации R0 или R1
Data: 8-битная константа (00h до FFh)
Описание: Инструкция загружает непосредственную константу в ячейку внутренней RAM, адрес которой хранится в Ri.
Синтаксис: MOV @Ri,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес 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: Не изменяет флаги;
ПРИМЕР:
Адрес RAM: TEMP=E2h, R1=E2h
До выполнения: SUM=58h
После выполнения: TEMP=58h
MOV bit,C – Скопировать флаг переноса в бит
C: Флаг переноса
Bit: Битово-адресуемая ячейка
Описание: Инструкция копирует состояние флага переноса C в указанный бит.
Синтаксис: MOV bit,C;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
После выполнения: Если C=0, то P1.2=0; если C=1, то P1.2=1
MOV C,bit – Скопировать бит в флаг переноса
C: Флаг переноса
Bit: Битово-адресуемая ячейка
Описание: Инструкция копирует состояние указанного бита в флаг переноса C.
Синтаксис: MOV C,bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: C обновляется;
ПРИМЕР:
После выполнения: Если 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: 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: Не изменяет флаги;
ПРИМЕР:
После выполнения: DPH=12h, DPL=34h
MOVX A,@Ri – Прочитать байт внешней RAM с 8-битным адресом
Ri: Регистр косвенной адресации R0 или R1
A: Регистр аккумулятора
Описание: Инструкция читает байт из внешней RAM по адресу, хранящемуся в Ri, и сохраняет его в аккумулятор.
Синтаксис: MOVX A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес внешней 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: Не изменяет флаги;
ПРИМЕР:
После выполнения подпрограммы "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: Не изменяет флаги;
ПРИМЕР:
Адрес внешней 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: Не изменяет флаги;
ПРИМЕР:
Адрес внешней 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;
ПРИМЕР:
До выполнения: 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: Не изменяет флаги;
ПРИМЕР:
Адрес внешней RAM: SUM=1234h, DPTR=1234h
До выполнения: A=58h
После выполнения: SUM=58h
ORL A,Rn – Побитовое ИЛИ рабочего регистра с аккумулятором
Rn: Рабочий регистр от R0 до R7
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию ИЛИ между аккумулятором и рабочим регистром Rn. Результат сохраняется в аккумуляторе.
Синтаксис: ORL A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C3h (11000011), R5=55h (01010101)
После выполнения: A=D7h (11010111)
NOP – Нет операции
Описание: Инструкция не выполняет никаких операций, используется для создания задержек.
Синтаксис: NOP;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Последовательность генерирует отрицательный импульс длительностью 5 машинных циклов на выводе P2.3. При 12 МГц каждый цикл = 1 мкс, длительность импульса = 5 мкс.
ORL A,@Ri – Побитовое ИЛИ байта косвенной RAM с аккумулятором
Ri: Регистр косвенной адресации R0 или R1
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию ИЛИ между аккумулятором и байтом внутренней RAM, адрес которого хранится в Ri. Результат сохраняется в аккумуляторе.
Синтаксис: ORL A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C2h (11000010), LOG=54h (01010100)
После выполнения: A=D6h (11010110)
ORL direct,A – Побитовое ИЛИ прямого байта с аккумулятором, результат в прямом байте
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию ИЛИ между байтом по прямому адресу и аккумулятором. Результат сохраняется по прямому адресу.
Синтаксис: ORL direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: TEMP=D6h (11010110)
ORL A,#data – Побитовое ИЛИ непосредственной константы с аккумулятором
Data: 8-битная константа (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию ИЛИ между аккумулятором и непосредственной константой. Результат сохраняется в аккумуляторе.
Синтаксис: ORL A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C2h (11000010)
После выполнения: A=C3h (11000011)
ORL C,bit – Побитовое ИЛИ бита с флагом переноса, результат в C
C: Флаг переноса
Bit: Битово-адресуемая ячейка
Описание: Инструкция выполняет побитовую операцию ИЛИ между флагом переноса C и указанным битом. Результат сохраняется в C.
Синтаксис: ORL C,bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: C обновляется;
ПРИМЕР:
До выполнения: ACC=C6h (11000110), C=0
После выполнения: C=1
ORL direct,#data – Побитовое ИЛИ непосредственной константы с прямым байтом
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
Data: 8-битная константа (00h до FFh)
Описание: Инструкция выполняет побитовую операцию ИЛИ между байтом по прямому адресу и непосредственной константой. Результат сохраняется по прямому адресу.
Синтаксис: ORL direct,#data;
Количество байт: 3 (байт кода операции, байт адреса, байт данных);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=C2h (11000010)
После выполнения: TEMP=D2h (11010010)
POP direct – Извлечь значение из стека в прямой байт
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
Описание: Инструкция извлекает значение из вершины стека и сохраняет его в байт по прямому адресу. Указатель стека уменьшается на 1.
Синтаксис: POP direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: SP=32h, стек содержит 01h,23h,20h
После выполнения: DPTR=0123h, SP=30h
ORL C,/bit – Побитовое ИЛИ инвертированного бита с флагом переноса
C: Флаг переноса
Bit: Битово-адресуемая ячейка
Описание: Инструкция выполняет побитовую операцию ИЛИ между флагом переноса C и инвертированным значением указанного бита. Результат сохраняется в C.
Синтаксис: ORL C,/bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: C обновляется;
ПРИМЕР:
До выполнения: ACC=C6h (11000110), C=0
После выполнения: C=0
RET – Возврат из подпрограммы
Описание: Инструкция завершает выполнение подпрограммы и возвращает управление в точку вызова.
Синтаксис: RET;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
PUSH direct – Поместить прямой байт в стек
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
Описание: Инструкция увеличивает указатель стека на 1 и сохраняет значение байта по прямому адресу в стек.
Синтаксис: PUSH direct;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: SP=30h, стек содержит 20h
После выполнения: SP=32h, стек содержит 20h,23h,01h
RL A – Циклический сдвиг аккумулятора влево
A: Регистр аккумулятора
Описание: Инструкция выполняет циклический сдвиг битов аккумулятора на одну позицию влево. Бит 7 переходит в бит 0.
Синтаксис: RL A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C2h (11000010)
После выполнения: A=85h (10000101)
RETI – Возврат из прерывания
Описание: Инструкция завершает обработку прерывания и возвращает управление в точку прерывания. PSW не восстанавливается автоматически.
Синтаксис: RETI;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
RR A – Циклический сдвиг аккумулятора вправо
A: Регистр аккумулятора
Описание: Инструкция выполняет циклический сдвиг битов аккумулятора на одну позицию вправо. Бит 0 переходит в бит 7.
Синтаксис: RR A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C2h (11000010)
После выполнения: A=61h (01100001)
RLC A – Циклический сдвиг аккумулятора влево через перенос
A: Регистр аккумулятора
Описание: Инструкция выполняет циклический сдвиг 9-битной комбинации (A + C) влево. Бит 7 переходит в C, C переходит в бит 0.
Синтаксис: RLC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C обновляется;
ПРИМЕР:
До выполнения: A=C2h (11000010), C=0
После выполнения: A=84h (10000100), C=1
SETB C – Установить флаг переноса в 1
C: Флаг переноса
Описание: Инструкция устанавливает флаг переноса C в 1.
Синтаксис: SETB C;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C=1;
ПРИМЕР:
После выполнения: C=1
Изменение флага переноса (SETB C / CLR C) используется для управления условными переходами (JC / JNC). В атаках на аппаратное обеспечение сбои напряжения или тактовой частоты могут изменить флаг переноса во время выполнения условных переходов, что позволяет обойти логику проверки безопасности.
RRC A – Циклический сдвиг аккумулятора вправо через перенос
A: Регистр аккумулятора
Описание: Инструкция выполняет циклический сдвиг 9-битной комбинации (A + C) вправо. Бит 0 переходит в C, C переходит в бит 7.
Синтаксис: RRC A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: C обновляется;
ПРИМЕР:
До выполнения: A=C2h (11000010), C=0
После выполнения: A=61h (01100001), C=0
SJMP rel – Короткий относительный переход
rel: Относительное смещение
Описание: Инструкция выполняет безусловный переход на адрес, вычисленный как текущий PC + смещение (диапазон -128..+127).
Синтаксис: SJMP rel;
Количество байт: 2 (байт кода операции, байт смещения);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: PC=323
После выполнения: PC=345
SETB bit – Установить бит в 1
Bit: Битово-адресуемая ячейка
Описание: Инструкция устанавливает указанный бит в 1.
Синтаксис: SETB bit;
Количество байт: 2 (байт кода операции, байт адреса бита);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
До выполнения: 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;
ПРИМЕР:
Адрес 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C6h, R3=29h
После выполнения: R3=C6h, A=29h
SWAP A – Обменять полубайты в аккумуляторе
A: Регистр аккумулятора
Описание: Инструкция обменивает местами старший и младший полубайты аккумулятора.
Синтаксис: SWAP A;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=E1h (11100001)
После выполнения: A=1Eh (00011110)
XCH A,@Ri – Обменять аккумулятор и байт косвенной RAM
Ri: Регистр косвенной адресации R0 или R1
A: Регистр аккумулятора
Описание: Инструкция обменивает значения аккумулятора и байта внутренней RAM, адрес которого хранится в Ri.
Синтаксис: XCH A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=FFh, SUM=29h
После выполнения: SUM=FFh, A=29h
XRL A,Rn – Побитовое исключающее ИЛИ рабочего регистра с аккумулятором
Rn: Рабочий регистр от R0 до R7
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию XOR между аккумулятором и рабочим регистром Rn. Результат сохраняется в аккумуляторе.
Синтаксис: XRL A,Rn;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C3h (11000011), R3=55h (01010101)
После выполнения: A=96h (10010110)
XCHD A,@Ri – Обменять младшие полубайты аккумулятора и косвенной RAM
Ri: Регистр косвенной адресации R0 или R1
A: Регистр аккумулятора
Описание: Инструкция обменивает младшие полубайты аккумулятора и байта внутренней RAM, адрес которого хранится в Ri. Старшие полубайты не изменяются.
Синтаксис: XCHD A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес RAM: SUM=E3h, R0=E3h
До выполнения: SUM=29h, A=A8h
После выполнения: A=A9h, SUM=28h
XRL A,@Ri – Побитовое исключающее ИЛИ байта косвенной RAM с аккумулятором
Ri: Регистр косвенной адресации R0 или R1
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию XOR между аккумулятором и байтом внутренней RAM, адрес которого хранится в Ri. Результат сохраняется в аккумуляторе.
Синтаксис: XRL A,@Ri;
Количество байт: 1 (байт кода операции);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
Адрес 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: A=C2h (11000010), LOG=54h (01010100)
После выполнения: A=96h (10010110)
XRL direct,A – Побитовое исключающее ИЛИ прямого байта с аккумулятором, результат в прямом байте
Direct: Регистр с адресом от 0 до 255 (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию XOR между байтом по прямому адресу и аккумулятором. Результат сохраняется по прямому адресу.
Синтаксис: XRL direct,A;
Количество байт: 2 (байт кода операции, байт адреса);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=C2h (11000010), A=54h (01010100)
После выполнения: TEMP=96h (10010110)
XRL A,#data – Побитовое исключающее ИЛИ непосредственной константы с аккумулятором
Data: 8-битная константа (00h до FFh)
A: Регистр аккумулятора
Описание: Инструкция выполняет побитовую операцию XOR между аккумулятором и непосредственной константой. Результат сохраняется в аккумуляторе.
Синтаксис: XRL A,#data;
Количество байт: 2 (байт кода операции, байт данных);
Затронутые флаги PSW: Не изменяет флаги;
ПРИМЕР:
До выполнения: 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: Не изменяет флаги;
ПРИМЕР:
До выполнения: TEMP=C2h (11000010), X=12h (00010010)
После выполнения: TEMP=D0h (11010000)
Более двух десятилетий прошло с момента выпуска оригинального ядра микроконтроллера 8051. За это время архитектура претерпела обширные итеративные обновления и функциональные улучшения. Сегодня десятки производителей полупроводников по всему миру выпускают совместимые производные микроконтроллеры под различными номерами. Современные обновленные версии предлагают значительно расширенные наборы функций по сравнению с исходной базовой конструкцией 8051. Большинство таких производных имеют маркировку «совместимый с 8051», «соответствует 8051» или «семейство 8051», чтобы подчеркнуть общее архитектурное происхождение. Эти обозначения означают идентичные архитектуры ядер ЦП и единые модели программирования с использованием стандартной системы команд 8051. В практических рабочих процессах разработки владение одним устройством в этом семействе позволяет легко перейти на любую другую совместимую модель, предоставляя инженерам доступ к сотням различных микроконтроллеров.
В этой главе основное внимание уделяется микроконтроллеру AT89S8253 производства Atman как представителю семейства. Это конкретное устройство было выбрано для детального анализа из-за его широкого промышленного применения, низкой стоимости и встроенной Flash-памяти программ. Характеристика Flash-памяти делает его идеальным для прототипирования и итеративного тестирования, поскольку образы программ можно многократно стирать и перепрограммировать тысячи раз. Кроме того, встроенный интерфейс последовательного программирования SPI позволяет перепрограммировать прошивку даже после того, как микросхема постоянно впаяна в готовые печатные платы.
Однако это удобное внутрисхемное программирование создает критические риски для безопасности прошивки. Если аппаратные биты блокировки устройства не запрограммированы, полное содержимое Flash-памяти программ может быть считано через интерфейс SPI. Atmel интегрировал трехуровневый механизм блокировки программной памяти для блокировки несанкционированного извлечения прошивки. Тем не менее, аппаратные предохранители безопасности не являются неуязвимыми для обхода. Злоумышленники успешно применяли атаки с декапсуляцией чипа и микрозондированием для обхода защиты битов блокировки и восстановления полных двоичных образов прошивки. В определенных сценариях эксплуатации раздел EEPROM на кристалле, который хранит конфиденциальные калибровочные параметры, серийные идентификаторы и криптографические ключи, может быть полностью считан с помощью инструкции MOVX, когда установлен бит управления EEMEN. Эта внутренняя уязвимость подчеркивает необходимость для разработчиков встраиваемых систем полностью понимать собственные механизмы безопасности AT89S8253 при проектировании продуктов, требующих надежной конфиденциальности и целостности прошивки.
AT89S8253 также интегрирует аппаратный модуль сторожевого таймера, который можно настроить для обнаружения событий вмешательства и немедленного полного сброса системы. Правильная конфигурация сторожевого таймера служит контрмерой против извлечения: если злоумышленник пытается остановить выполнение ЦП для зондирования шины или дампа памяти, тайм-аут сторожевого таймера вызовет сброс устройства и прервет попытки восстановления данных. Однако злоумышленники могут использовать атаки сбоями тактовой частоты или прямое манипулирование регистрами SFR управления сторожевого таймера, чтобы отключить таймер, если эти регистры остаются незащищенными битами блокировки. Совместное использование битов блокировки и логики сброса сторожевого таймера создает многоуровневый аппаратный барьер безопасности, который повышает сложность и стоимость клонирования устройств и обратного проектирования. Как видно на всех микроконтроллерах семейства 8051, ни один отдельный аппаратный примитив безопасности не обеспечивает абсолютной защиты. Полное восстановление прошивки обычно требует комбинирования нескольких методов атак, включая электромагнитный анализ побочных каналов, сбои напряжения/частоты и полную декапсуляцию кремния для доступа к внутренним предохранителям безопасности и ячейкам памяти. Как средства защиты встраиваемых систем, так и методы вредоносного извлечения продолжают развиваться вместе с промышленным развертыванием микроконтроллеров.
Кристалл AT89S8253 доступен в трех стандартных корпусах:
Фактор формы физического корпуса напрямую влияет на сложность деструктивных атак декапсуляции. Более крупные корпуса с увеличенной площадью открытого кремния (такие как DIP и PLCC) значительно легче поддаются вскрытию и микрозондированию, чем компактные корпуса TQFP для поверхностного монтажа. Независимо от варианта корпуса, биты блокировки остаются основной линией защиты от внешнего дампа прошивки через интерфейс программирования. Лучшие практики предписывают программировать наивысший доступный уровень безопасности для отключения всех команд обратного чтения SPI. Многие команды разработчиков дополнительно защищают устройства, постоянно отключая цепи выводов SPI после массового производства, чтобы повысить барьер для несанкционированных попыток извлечения прошивки.
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 Выход кварцевого генератора.
Банк программной памяти объемом 12 КБ реализован на технологии Flash с плавающим затвором, что позволяет многократно стирать и перепрограммировать прошивку. Запись двоичных образов выполняется через интерфейс SPI. Поддерживается расширение внешней программной памятью, но 12 КБ достаточно для большинства приложений.
С точки зрения безопасности, Flash-память программ является основной целью для несанкционированного восстановления прошивки. Правильно запрограммированные биты блокировки блокируют внешние команды чтения через SPI. Однако физический доступ к чипу позволяет проводить дорогостоящие, но проверенные атаки декапсуляции, которые снимают защитное покрытие для доступа к кремниевому кристаллу и микрозондирования ячеек Flash. Для смягчения этого вектора атак Atmel реализовал трехуровневую систему блокировки, но все аппаратные предохранители остаются уязвимыми для продвинутого лабораторного оборудования.
Внутреннее пространство RAM разделено на три блока по 128 байт:
EEPROM — это энергонезависимая память, сочетающая гибкость RAM и сохранность данных ROM. AT89S8253 имеет 2 КБ (2048 байт) EEPROM.
EEPROM обычно используется для хранения серийных номеров, калибровочных коэффициентов и криптографических ключей. Успешное считывание EEPROM раскрывает все конфиденциальные данные. Биты блокировки также ограничивают чтение EEPROM через SPI, но она уязвима для электромагнитного анализа и сбоев напряжения. В некоторых сценариях полный дамп EEPROM возможен с использованием MOVX при установленном бите EEMEN в EECON.
Все правила расширения внешней памяти для базового 8051 полностью применимы к AT89S8253. Можно расширять как программную, так и data-память до 64 КБ каждая.
Понимание этих режимов критично для безопасности. Косвенная адресация может быть использована для доступа к защищенным областям памяти, если злоумышленник может изменить значение указателя в R0/R1.
AT89S8253 имеет 40 SFR. 22 основных регистра сохранены для совместимости, остальные добавлены для управления расширенной периферией.
Наиболее важным для безопасности является EECON, управляющий доступом к EEPROM. Установка бита EEMEN позволяет полностью дампить EEPROM с помощью MOVX, обходя биты блокировки. Это известная уязвимость многих производных 8051. WDTCON управляет стороженым таймером, но может быть отключен сбоями или прямыми записями, если не защищен битами блокировки.
Стандартный 8-битный регистр ядра 8051.
Стандартный регистр ядра, используется для умножения и деления.
Стандартный регистр флагов ядра 8051.
Стандартный указатель стека ядра 8051.
Стандартные регистры портов ввода-вывода ядра 8051.
Стандартные регистры ядра 8051.
Содержит два управляющих бита:
DPTR — это 16-битный указатель, состоящий из DPH и DPL. Бит DPS в EECON выбирает активный указатель.
DPS=0 – активен DPTR0.
DPS=1 – активен DPTR1.
Переключение указателей может быть использовано для доступа к защищенным областям памяти, включая биты блокировки.
EEPROM объемом 2 КБ используется для хранения данных, сохраняющихся при отключении питания. Управление осуществляется через EECON. Инструкция MOVX используется как для доступа к EEPROM, так и к внешней RAM в зависимости от бита EEMEN.
WRTINH – блокировка записи при низком напряжении (только чтение).
RDY/BSY – флаг готовности/занятости.
DPS – выбор активного указателя данных.
EEMEN – выбор между EEPROM и внешней RAM для MOVX.
Бит EEMEN является основным вектором атак для несанкционированного дампа EEPROM. Если злоумышленник может установить этот бит, он может считать все содержимое EEPROM, включая ключи и серийные номера.
EEMWE – разрешает запись в EEPROM.
EELD – включает буферизованную запись по 32 байта для ускорения программирования.
Сторожевой таймер питается от основного генератора. По умолчанию отключен, останавливается в режиме 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 мс |
PS2,PS1,PS0 – выбор времени переполнения.
WDIDLE – работа сторожевого таймера в режиме Idle.
DISRTO – разрешает вывод сигнала сброса на вывод RST.
HWDT – аппаратный/программный режим.
WSWRST – сброс сторожевого таймера.
WDTEN – включение сторожевого таймера.
Сторожевой таймер служит защитой от дампа памяти: попытка остановить ЦП вызывает сброс. Рекомендуется использовать аппаратный режим с коротким таймаутом.
AT89S8253 имеет шесть источников прерываний. Каждый может быть включен/отключен через IE (Interrupt Enable). Глобальное разрешение управляется битом EA.
EA – глобальное разрешение прерываний.
ET2 – разрешение прерывания Timer 2.
ES – разрешение последовательных прерываний (UART/SPI).
ET1 – разрешение прерывания Timer 1.
EX1 – разрешение внешнего прерывания INT1.
ET0 – разрешение прерывания Timer 0.
EX0 – разрешение внешнего прерывания INT0.
Прерывания могут использоваться как контрмера против вмешательства.
AT89S8253 имеет четыре уровня приоритета (0–3), настраиваемых через IP и IPH. Правила разрешения конфликтов:
Если два прерывания одного приоритета возникают одновременно, используется фиксированный порядок:
Устанавливает младший бит приоритета для каждого прерывания.
Устанавливает старший бит приоритета. Комбинация IP и IPH дает уровень 0–3.
| IP | IPH | Уровень |
|---|---|---|
| 0 | 0 | 0 (низший) |
| 0 | 1 | 1 |
| 1 | 0 | 2 |
| 1 | 1 | 3 (высший) |
| Источник | Вектор |
|---|---|
| INT0 | 03h |
| Timer 0 | 0Bh |
| INT1 | 13h |
| Timer 1 | 1Bh |
| UART/SPI | 23h |
| Timer 2 | 2Bh |
4. В конце обработчика RETI восстанавливает адрес из стека.
Полностью совместимы с классическим 8051.
16-битный таймер/счетчик с дополнительными возможностями. Состоит из TH2, TL2 и регистров захвата/автоперезагрузки RCAP2H, RCAP2L.
TF2 – флаг переполнения T2.
EXF2 – флаг внешнего события на T2EX.
RCLK – выбор источника тактов для приема UART.
TCLK – выбор источника тактов для передачи UART.
EXEN2 – разрешение внешнего управления T2EX.
TR2 – запуск T2.
C/T2 – выбор режима: таймер (0) или счетчик (1).
CP/RL2 – выбор режима: захват (1) или автоперезагрузка (0).
При CP/RL2=1 и EXEN2=1 падение на T2EX копирует TH2/TL2 в RCAP2H/RCAP2L.
При CP/RL2=0 переполнение T2 копирует RCAP2H/RCAP2L в TH2/TL2.
T2OE – разрешает вывод тактовой частоты на P1.0.
DCEN – разрешает двунаправленный счет.
При установке RCLK или TCLK T2 работает как генератор бод-рейта.
При T2OE=1 и C/T2=0 на P1.0 выдается меандр с частотой по формуле.
Полностью совместим с классическим 8051, четыре режима, выбор через SM0/SM1 в SCON.
Режим SM2 в SCON включает аппаратную адресацию для многоузловых сетей. Используются регистры SADDR (адрес) и SADEN (маска).
Синхронный последовательный интерфейс для связи с периферией. Использует выводы: MOSI, MISO, SCK, SS.
SPI является основным интерфейсом программирования AT89S8253. Без битов блокировки позволяет полностью считать Flash.
Данные записываются в SPDR и передаются через сдвиговый регистр. После передачи устанавливается флаг SPIF.
Использует буфер для повышения пропускной способности.
SPIF – флаг завершения передачи.
WCOL – флаг коллизии записи.
DISSO – отключение вывода MISO.
ENH – включение расширенного режима.
SPIE – разрешение прерываний SPI.
SPE – включение SPI.
DORD – порядок бит (0 – MSB first, 1 – LSB first).
MSTR – режим мастер/ведомый.
CPOL – полярность SCK.
CPHA – фаза SCK.
SPR1,SPR0 – скорость SCK в режиме мастера.
Поддерживаются три режима: Normal (~25 мА), Idle (~6.5 мА), Power-Down (~40 мкА). Управление через 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 должны сбрасываться вручную.
Аккумулятор (адрес E0h):
| ACC | ||||||||
|---|---|---|---|---|---|---|---|---|
| Сброс | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Бит | - | - | - | - | - | - | - | - |
| Адрес | E7 | E6 | E5 | E4 | E3 | E2 | E1 | E0 |
Серия 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, нажмите здесь, чтобы узнать
У разных производителей разные номера деталей, но внутреннее ядро микросхемы может быть изготовлено по одной технологии. Невозможно перечислить все номера деталей, к которым может применяться наша технология, например MYSON, STK, FEELING, ANALOG, FUJITSU, NOVATEK, LG/HYNDAI.
Кроме того, с развитием технологий мы ежедневно накапливаем опыт и разрабатываем новые методы обратного проектирования для различных интегральных схем. Полный список номеров интегральных схем, входящих в нашу компетенцию, постоянно растет, пожалуйста, свяжитесь с нами для уточнения.
Mikatech Innovative Limited понимает важность конфиденциальности своих клиентов. В момент обращения в Mikatech ваша личная информация будет защищена нашими управленческими регламентами, разработанными за годы практики. Mikatech использует эту информацию для настройки своих услуг под вас и никогда не раскрывает ее третьим лицам по любой причине.
По каждому проекту мы удаляем все данные, материалы и коды через 60 дней после передачи файлов, что защищает нас и вашу конфиденциальность.
Да, это абсолютно законно.
Mikatech предоставляет услуги обратного проектирования только в образовательных целях. Использование вышеуказанных услуг может быть незаконным в некоторых странах или регионах, проверьте местные законы.
Mikatech не несет ответственности за использование услуг, которое может считаться незаконным.