Система команд микроконтроллера
Микроконтроллер имеет 255 команд: пересылки данных, арифметических операций, логических операций, передачи управления, операций с битами. По формату команды могут быть одно-, двух- и трехбайтовыми. Из 111 базовых команд 64 выполняются за один машинный цикл (1 мкс при частоте кварца 12 МГц), 45 команд — за два. Команды умножения и деления выполняются за четыре машинных цикла.
Обозначения операндов расшифрованы далее после таблицы команд микроконтроллера. Ниже приведены примеры команд.
Команда ADD A, «байт-источник»[3].
Эта команда (сложение) складывает содержимое аккумулятора А с содержимым байта-источника, оставляя результат в аккумуляторе. При появлении переноса из разрядов 7 и 3 устанавливаются флаги переноса С и дополнительного переноса АС соответственно, в противном случае эти флаги сбрасываются. При сложении целых чисел без знака флаг переноса указывает, что сумма больше 255. Флаг переполнения OV устанавливается, если есть перенос из бита 6 и нет переноса из бита 7, или есть перенос из бита 7 и нет — из бита 6, в противном случае флаг OV сбрасывается. При сложении целых чисел со знаком флаг OV указывает на отрицательную величину, полученную при сложении двух положительных операндов или на положительную сумму для двух отрицательных операндов. Время выполнения команды — один машинный цикл.
Для команды сложения разрешены следующие способы адресации байта-источника:
1) регистровый (в качестве операнда используются регистры R0-R7);
2) косвенно-регистровый (@ — префикс косвенной адресации, в качестве регистров-указателей памяти могут использоваться R0 и R1);
3) прямой (указывается прямой адрес байта РПД или регистра специальных функций);
4) непосредственный (# — префикс непосредственных данных).
Команда LCALL «ad16».
Команда «длинный вызов» вызывает подпрограмму, находящуюся по указанному адресу. К счетчику команд РС прибавляется 3 для получения адреса следующей команды и после этого полученный 16-битовый результат помещается в стек (сначала следует младший байт, за ним — старший), а содержимое указателя стека SP увеличивается на 2.
Затем старший и младший байты счетчика команд загружаются соответственно вторым и третьим байтом команды LCALL. Выполнение программы продолжается командой, находящейся по полученному адресу. Подпрограмма может начинаться в любом месте памяти программ объемом до 64 Кбайт. Команда на флаги не влияет.
Команда RET.
Команда «возврат из подпрограммы» последовательно выгружает старший и младший байты счетчика команд из стека, уменьшая указатель стека на 2. Выполнение основной программы продолжается по адресу команды, следующей за АCALL или LCALL. На флаги эта команда не влияет.
Пример: ; (SP) = 66H, (ОЗУ[65H])=29H, (ОЗУ[66H])=01H
RET ; (SP) = 64H, (PC)= 0129Н
Команда RETI.
Команда «возврат из прерывания» выгружает старший и младший байты счетчика команд из стека, уменьшая указатель стека на 2. Устанавливает логику прерываний, разрешая прием других прерываний с уровнем приоритета, равным уровню приоритета только что обработанного прерывания. Слово состояния программы PSW не восстанавливается автоматически.
Выполнение основной программы продолжается с команды, следующей за командой, на которой произошел переход к обнаружению запроса на прерывание. Если при выполнении команды RETI обнаружено прерывание с таким же или меньшим уровнем приоритета, то одна команда основной программы успевает выполниться до обработки такого прерывания.
Результаты трансляции 13 типов команд микроконтроллера МК51 иллюстрирует приводимая ниже программа (число байт — 1, 2 или 3).
Дата добавления: 2016-01-09; просмотров: 865;