MCS-51 (1031646), страница 17
Текст из файла (страница 17)
(R0)=3AH,Пример:;(03У[ЗА])=1АН, (С)=1ADDCA,@R0 ;(A)=F0H, (03У[ЗА]=1АН),;(С)=0, (АС)=1, (OV)=03) Ассемблер:ADDC A,<direct>00110101 <direct address>Код:1 циклВремя:(A):=(A)+(C)+(direct)Алгоритм:(С):=Х, (АС):=Х, (0V):=X, где Х=(0 или 1);(А)=11Н, (ОЗУ[80] )=DFH, (C)=lПример:;(A)=F1H, (C)=0, (АС)=1, (OV)=0ADDC A,80H4) Ассемблер:ADDC A,#data00110100 #dataКод:1 циклВремя:(A):=(A)+(C)+(direct)Алгоритм:(С):=Х, (АС):=Х, (0V):=X, где Х=(0 или 1);(А)=55Н, (С)=0Пример:;(A)=AAH, (C)=0, (AC)=0, (OV)=lADDC A,#55HКоманда AJHP <addrll>Команда "абсолютный переход", передает управление по указанному адресу, который получается при конкатенации пяти старших бит счетчика команд PC (после увеличения его на два),7—5 битов кода операции и второго байта команды. Адрес перехода должен находится внутри одной страницы объемом 2 Кбайт памяти программы, определяемой пятью старшими битами счетчика команд.Ассемблер:AJMP <метка>А10А9 А8 0 0 0 0 1 А7 А6 А5 А4 A3 А2 Al A0Код:2 циклаВремя:(РС[15-0]):=(РС[15-0])+2,Алгоритм:(PC[10-0]):=<addrll>;(PC)=028FHПример:;Метке МТ2 соответствует адрес 034АН МТ2;(РС)=034АНAJMP MT276Команда ANL <байт-назначения), <байт-источник>Команда "логическое "И" для переменных-байтов" выполняет операцию логического "И"над битами указанных переменных и помещает результат в байт назначения.
Эта операция невлияет на состояние флагов.Два операнда обеспечивают следующие комбинации шести режимов адресации:—байтом назначения является аккумулятор (А):1)регистровый;2)прямой;3)косвенно-регистровый;4)непосредственный;—байтом назначения является прямой адрес (direct):5)прямой аккумуляторный;6)непосредственный (байт-источник равен константе).1) Ассемблер:ANL A, Rn; где n=0-71011rrr, где rrr=000-111Код:1 циклВремя:(А):=(А) AND (Rn)Алгоритм:;(A)=FEH, (R2)=C5HПример:;(A)=C4H, (R2)=C5HANL A, R22) Ассемблер:ANL A,<direct>01010101 direct addressКод:1 циклВремя:(A):=(A) AND (direct)Алгоритм:Пример:;(A)=A3H, (PSW)=86HANL A, PSW3) Ассемблер:Код:Время:Алгоритм:Пример:4) Ассемблер:Код:Время:Алгоритм:Пример:ANL A, @R0ANL A,#data01010100 #data81 цикл(A):=(A) AND #dataANL A,#0DDH5) Ассемблер:Код:Время:Алгоритм:Пример:6) Ассемблер:Код:Время:Алгоритм:Пример:;(A)=82H, (PSW)=86HANL A,@Ri ;где i=0,l0101011i1 цикл(A):=(A) AND ((Ri));(A)=BCH, (03У[35])=47Н, (R0)=35H;(А)=04Н, (03У[35])=47H;(А)=36Н;(A)=14HANL <direct>, A01010010 <direct address>1 цикл(direct):=(direct) AND (A);(А)=55Н, (Р2)=ААН;(Р2)=00Н, (А)=55НANL Р2, АANL <direct>, #data01010011 <direct address> #data81 цикл(direct):=(direct) AND #dataANL P1,#73H;(P1)=FFH;(P1)=73HПримечание.
Если команда "ANL" применяется для изменения содержимого порта, то значение,используемое в качестве данных порта, будет считываться из "защелки" порта, а не с выводовБИС.Команда ANL С. <бит источника>Команда "логическое "И" для переменных-битов", выполняет операцию логического "И"над указанными битами. Если бит-источник равен "0", то происходит сброс флага переноса, в противном случае флаг переноса не изменяет текущего значения. "/" перед операндом в языке ассемб-77лера указывает на то, что в качестве значения используется логическое отрицание адресуемого бита, однако сам бит источника при этом не изменяется. На другие флаги эта команда не влияет.Для операнда-источника разрешена только прямая адресация к битам.1) Ассемблер:ANL C,<bit>10000010 <bit address>Код:2 циклаВремя:(С):=(С) AND (bit)Алгоритм:;(С)=1, Р1[0]=0Пример:;(С)=0, Р1[0]=0 ANL C,</bit>ANL С, Р1.02) Ассемблер:ANL C,</bit>10110000 <bit address>Код:2 циклаВремя:(C):=(C) AND (/bit)Алгоритм:Пример:;(C)=1, (AC)=0ANL C, /AC;(C)=1, (AC)=0Команда CJHF, <байт назначения> , <байт источник>, <смешение>Команда "сравнение и переход, если не равно" сравнивает значения первых двух операндов и выполняет ветвление, если операнды не равны.
Адрес перехода (ветвления) вычисляется припомощи сложения значения (со знаком), указанного в последнем байте команды, с содержимымсчетчика команд после увеличения его на три.Флаг переноса С" устанавливается в "1", если значение целого без знака <байта назначения) меньше, чем значение целого без знака < байта источника >, в противном случае переноссбрасывается (если значения операндов равны, флаг переноса сбрасывается). Эта команда не оказывает влияния на операнды.Операнды, стоящие в команде, обеспечивают комбинации четырех режимов адресации:—если байтом назначения является аккумулятор:1)прямой2)непосредственный,—если байтом назначения является любая ячейка ОЗУ с косвенно-регистровойили регистровой адресацией:3)непосредственный к регистровому4)непосредственный к косвенно-регистровому1) Ассемблер:CJNE A,<direct>,<метка>10110101 <direct address> <rel8>Код:2 циклаВремя:(РС):=(РС)+3,Алгоритм:если (direct)<(A) то (PC):=(PC)+<rel8>, C:=0если (dlrect)>(A), то (PC):=(PC)+<rel8>, C:=l;(А)=97Н, (P2)=F0H, (C)=0Пример:CJNE А, Р2, МТЗ…..МТЗ: CLR2) Ассемблер:Код:Время:Алгоритм:Пример:;(А)=97Н, (P2)=F0H, (С)=1;Адрес, соответствующийметке ;МТЗ вычисляется ,как ;(РС):=(РС)+3+(ге18)CJNE A,<#data>,<метка>10110100 <#data> <rel8>2 цикла(РС):=(РС)+3,если #data<(A) то (PC):=(PC)+<rel8>, C:=0если #data >(A), то (PC):=(PC)+<rel8>, C:=l;(А)=FCН, (C)=1CJNE А, #0BFH, МТ4…….МТ4: INC A;(А)=FDН, (С)=078;(РС):=(РС)+3+(ге18)3) Ассемблер:Код:Время:Алгоритм:Пример:CJNE Rn,#data,<метка> ; где n=0-710111rrr <#data> <rel8>2 цикла(РС):=(РС)+3,если #data<(Rn), то (PC):=(PC)+<rel8>, C:=0если #data >(Rn), то (PC):=(PC)+<rel8>, C:=l;(R7)=80H, (C)=0CJNE R7,#81H,MT5……МТ5: NOP4) Ассемблер:Код:Время:Алгоритм:Пример:;(R7)=80H, (C)=l,;(PC):=(PC)+3+(rel8)CJNE @Ri,#data,<метка> ; где i=0, 11011011i <#data> <rel8>2 цикла(РС):=(РС)+3,если #data<((Ri)), то (PC):=(PC)+<rel8>, C:=0если #data >((Ri)), то (PC):=(PC)+<rel8>, C:=l;(R0)=41H,(C)=l, (ОЗУ[41])=57НCJNE @R0,#29H,MT6……МТ6: DEC R0Команда CLR АКоманда "сброс аккумулятора"тора А.
На флаги команда не влияет.Ассемблер:CLR A11100100Код:1 циклВремя:(А):=0Алгоритм:Пример:CLR А;(03У[41])=57Н, (С)=0,;(РС):=(РС)+3+(ге18)сбрасывает(обнуляет)содержимое аккумуля-;(A)=6DH, (C)=0, (АС)=1,; (А)=00Н, (С)=0, (АС)=1Команда CLR <bit>Команда "сброс бита" сбрасывает указанный бит в нуль. Эта команда работает с флагомпереноса "С" или любым битом с прямой адресацией.1) Ассемблер:CLR C11000011Код:1 циклВремя:(C):=0Алгоритм:Пример:;(С)=1CLR С2) Ассемблер:Код:Время:Алгоритм:Пример:;(С)=0CLR <bit>110000101 цикл(bit):=0CLR P1.3;(Р1)=5ЕН (01011110В);(Р1)=56Н (01010110В)Команда СРL. АКоманда "инверсия аккумулятора" каждый бит аккумулятора инвертирует (изменяет напротивоположный). Биты, содержащие "единицы", после этой команды будут содержать "нули", инаоборот. На флаги эта операция не влияет.79Ассемблер:Код:Время:Алгоритм:Пример:CPL А111101001 цикл(А):=/(A)CPL А;(А)=65Н (01100101В);(A)=9AH (10011010B);Команда CPL <bit>Команда "инверсия бита" инвертирует (изменяет на противоположное значение) указанный бит.
Бит, который был "единицей", изменяется в "нуль" и наоборот. Команда С PL может работать с флагом переноса или с любым прямо адресуемым битом. На другие флаги команда невлияет.1) Ассемблер:CPL <bit>10110010 <bit address>Код:1 циклВремя:(bit):=/(bit)Алгоритм:Пример:CPL Pl.lCPL P1.32) Ассемблер:Код:Время:Алгоритм:Пример:;(Р1)=39Н (00111001В);(P1)=33H (00110011В)CPL С101100111 цикл(C):=/(C);(С)=1, (АС)=1, (OV)=0;(С)=0, (АС)=1, (OV)=0CPL CПримечание: Если эта команда используется для изменения информации на выходе порта,значение, используемое как исходные данные, считывается из "защелки" порта, а не с выводовВИС.Команда DA AКоманда "десятичная коррекция аккумулятора для сложения" упорядочивает 8-битовуювеличину в аккумуляторе после выполненной ранее команды сложения Двух переменных (каждаяв упакованном двоично-десятичном формате).
Для выполнения сложения может использоватьсялюбая из типов команд ADD или ADDC. Если значение битов 3—0 аккумулятора (А) превышает 9(ХХХХ 1010—ХХХХ 1111) или, если флаг АС равен "1", то к содержимому (А) прибавляется 06,получая соответствующую двоично-десятичную цифру в младшем полубайте. Это внутреннее побитовое сложение устанавливает флаг переноса, если перенос из поля младших четырех бит распространяется через все старшие биты, а в противном случае не изменяет флаг переноса.Если после этого флаг переноса равен "1", или, если значение четырех старших бит(7 - 4) превышает 9 (1010 ХХХХ - 1111 ХХХХ), значения этих старших бит увеличивается на6, создавая соответствующую двоично-десятичную цифру в старшем полубайте.
И снова при этомфлаг переноса устанавливается, если перенос получается из старших битов, но не изменяется впротивном случае. Таким образом, флаг переноса указывает на то, что сумма двух исходных двоично-десятичных переменных больше чем 100. Эта команда выполняет десятичное преобразование с помощью сложения 06, 60, 66 с содержимым аккумулятора в зависимости от начального состояния аккумулятора и слова состояния программы (PSW). Ассемблер:Ассемблер:DA A11010100Код:1 циклВремя:если ((А[3-0])>9 или (АС)=1), то А[3-0]:=А[3-0]+6Алгоритм:если ((А[7-4])>9 или (С)=1), то А[7-4]:=А[7-41+6;(А)=56Н, (R3)=67H, (С)=1Примеры:а) ADDC A,R3;(A)=24H, (R3)=67H, (С)=1DA A;(A)=30H, (C)=0б) ADD А, #99НDA А;(А)=29, (С)=180Примечание: Команда DA А не может просто преобразовать шестнадцатиричное значениев аккумуляторе в двоично-десятичное представление и не применяется, например, для десятичного вычитания.Команда DEC <байт>Команда "декремент" производит вычитание "1" из указанного операнда.