Группа команд пересылки данных
Большую часть команд данной группы (табл. 3.2) составляют команды передачи и обмена байтов. Команды пересылки бит представлены в группе команд битовых операций. Все команды данной группы не модифицируют флаги результата, за исключением команд загрузки PSW и аккумулятора (флаг паритета).
Структура информационных связей. В зависимости от способа адресации и места расположения операнда можно выделить девять типов операндов, между которыми возможен информационный обмен. Граф возможных операций передачи данных показан на рис. 3.22. Аккумулятор (А) представлен на этом графе отдельной вершиной, так как многие команды используют неявную (подразумеваемую) адресацию.
В отличие от МК48 передачи данных в МК51 могут выполняться без участия аккумулятора.
Аккумулятор. В отличие от МК48 обращение к аккумулятору может быть выполнено в МК51 с использованием неявной и прямой адресации. В зависимости от способа адресации аккумулятора применяется одно из символических имен: A или ACC (прямой адрес). При прямой адресации обращение к аккумулятору производится как к одному из РСФ, и его адрес указывается во втором байте команды.
Использование неявной адресации аккумулятора предпочтительнее, однако не всегда возможно, например при обращении к отдельным битам аккумулятора.
Обращение к внешней памяти данных. Режим косвенной адресации ВПД, имеющийся в МК48, реализован также и в МК51. При использовании команд MOVX @Ri обеспечивается доступ к 256 байтам внешней памяти данных.
Существует также режим обращения к расширенной ВПД, когда для доступа используется 16-битный адрес, хранящийся в ретистре-указателе данных (DPTR). Команды MOVX @DPTR обеспечивают доступ к 65 536 байтам ВПД.
Таблица 3.2. Группа команд передачи данных
Название команды | Мнемокод | КОП | Т | Б | Ц | Операция |
Пересылка в аккумулятор из регистра (n = 0 - 7) | MOV A, Rn | 11101rrr | (A) = (Rn) | |||
Пересылка в аккумулятор прямоадресуемого байта | MOV A, ad | (A) = (ad) | ||||
Пересылка в аккумулятор байта из РДП (i = 0, 1) | MOV A, @Ri | 1110011i | (A) = ((Ri)) | |||
Загрузка в аккумулятор константы | MOV A, #d | (A) = #d | ||||
Пересылка в регистр из аккумулятора | MOV Rn, A | 11111rrr | (Rn) = (A) | |||
Пересылка в регистр прямоадресуемого байта | MOV Rn, ad | 10101rrr | (Rn) = (ad) | |||
Загрузка в регистр константы | MOV Rn, #d | 01111rrr | (Rn) = #d | |||
Пересылка по прямому адресу аккумулятора | MOV ad, A | (ad) = (A) | ||||
Пересылка по прямому адресу регистра | MOV ad, Rn | 10001rrr | (ad) = (Rn) | |||
Пересылка прямоадресуемого байта по прямому адресу | MOV add, ads | (add) = (ads) | ||||
Пересылка байта из РДП по прямому адресу | MOV ad, @Ri | 1000011i | (ad) = ((Ri)) | |||
Пересылка по прямому адресу константы | MOV ad, #d | (ad) = #d | ||||
Пересылка в РДП из аккумулятора | MOV @Ri, A | 1111011i | ((Ri)) = (A) | |||
Пересылка в РДП прямоадресуемого байта | MOV @Ri, ad | 0110011i | ((Ri)) = (ad) | |||
Пересылка в РДП константы | MOV @Ri, #d | 0111011i | ((Ri)) = #d | |||
Загрузка указателя данных | MOV DPTR, #d16 | (DPTR) = #d16 | ||||
Пересылка в аккумулятор байта из ПП | MOVC A, @A + DPTR | (A) = ((A) + (DPTR)) | ||||
Пересылка в аккумулятор байта из ПП | MOVC A, @A + PC | (PC) = (PC) + 1 (A) = ((A) + (PC)) | ||||
Пересылка в аккумулятор байта из ВПД | MOVX A, @Ri | 1110001i | (A) = ((Ri)) | |||
Пересылка в аккумулятор байта из расширенной ВПД | MOVX A, @DPTR | (A) = ((DPTR)) | ||||
Пересылка в ВПД из аккумулятора | MOVX @Ri, A | 1111001i | ((Ri)) = (A) | |||
Пересылка в расширенную ВПД из аккумулятора | MOVX @DPTR, A | ((DPTR)) = (A) | ||||
Загрузка в стек | PUSH ad | (SP) = (SP) + 1 ((SP)) = (ad) | ||||
Извлечение из стека | POP ad | (ad) = (SP) (SP) = (SP) - 1 | ||||
Обмен аккумулятора с регистром | XCH A, Rn | 11001rrr | (A) <-> (Rn) | |||
Обмен аккумулятора с прямоадресуемым байтом | XCH A, ad | (A) <-> (ad) | ||||
Обмен аккумулятора с байтом из РДП | XCH A, @Ri | 1100011i | (A) <-> ((Ri)) | |||
Обмен младшей тетрады аккумулятора с младшей тетрадой байта РДП | XCHD A, @Ri | 1101011i | (A0-3) <-> ((Ri) 0-3) |
Группа команд арифметических операций
Данную группу образуют 24 команды (табл. 3.3), выполняющие операции сложения, десятичной коррекции, инкремента/декремента байтов. Дополнительно по сравнению с МК48 введены команды вычитания, умножения и деления байтов.
Таблица 3.3. Группа команд арифметических операций
Название команды | Мнемокод | КОП | Т | Б | Ц | Операция |
Сложение аккумулятора с регистром (n = 0 - 7) | ADD A, Rn | 00101rrr | (A) = (A) + (Rn) | |||
Сложение аккумулятора с прямоадресуемым байтом | ADD A, ad | (A) = (A) + (ad) | ||||
Сложение аккумулятора с байтом из РПД (i = 0, 1) | ADD A, @Ri | 0010011i | (A) = (A) + ((Ri)) | |||
Сложение аккумулятора с константой | ADD A, #d | (A) = (A) + #d | ||||
Сложение аккумулятора с регистром и переносом | ADDC A, Rn | 00111rrr | (A) = (A) + (Rn) + (C) | |||
Сложение аккумулятора с прямоадресуемым байтом и переносом | ADDC A, ad | (A) = (A) + (ad) + (C) | ||||
Сложение аккумулятора с байтом из РПД и переносом | ADDC A, @Ri | 0011011i | (A) = (A) + ((Ri)) + (C) | |||
Сложение аккумулятора с константой и переносом | ADDC A, #d | (A) = (A) + #d + (C) | ||||
Десятичная коррекция аккумулятора | DA A | Если (A0-3) > 9 \/ ((AC) = 1), то (A0-3) = (A0-3) + 6, затем если (A4-7) > 9 \/ ((C) = 1), то (A4-7) = (A4-7) + 6 | ||||
Вычитание из аккумулятора регистра и заема | SUBB A, Rn | 10011rrr | (A) = (A) - (C) - (Rn) | |||
Вычитание из аккумулятора прямоадресуемого байта и заема | SUBB A, ad | (A) = (A) - (C) - ((ad)) | ||||
Вычитание из аккумулятора байта РПД и заема | SUBB A, @Ri | 1001011i | (A) = (A) - (C) - ((Ri)) | |||
Вычитание из аккумулятора константы и заема | SUBB A, #d | (A) = (A) - (C) - #d | ||||
Инкремент аккумулятора | INC A | (A) = (A) + 1 | ||||
Инкремент регистра | INC Rn | 00001rrr | (Rn) = (Rn) + 1 | |||
Инкремент прямоадресуемого байта | INC ad | (ad) = (ad) + 1 | ||||
Инкремент байта в РПД | INC @Ri | 0000011i | ((Ri)) = ((Ri)) +1 | |||
Инкремент указателя данных | INC DPTR | (DPTR) = (DPTR) + 1 | ||||
Декремент аккумулятора | DEC A | (A) = (A) - 1 | ||||
Декремент регистра | DEC Rn | 00011rrr | (Rn) = (Rn) - 1 | |||
Декремент прямоадресуемого байта | DEC ad | (ad) = (ad) - 1 | ||||
Декремент байта в РПД | DEC @Ri | 0001011i | ((Ri)) = ((Ri)) -1 | |||
Умножение аккумуллятора на регистр B | MUL AB | (B)(A) = (A)*(B) | ||||
Деление аккумулятора на регистр B | DIV AB | (A).(B) = (A)/(B) |