MCS-51 (1031646), страница 18
Текст из файла (страница 18)
Начальное значение 00Н перейдет в 0FFH. Команда DEC не влияет на флаги. Этой командой допускается четырережима адресации операнда:1) к аккумулятору2) регистровый3) прямой4) косвенно-регистровый1) Ассемблер:DEC A00010100Код:1 циклВремя:(А):=(А)-1Алгоритм:;(А)=11Н, (С)=1, (АС)=1Пример:;(А)=10Н, (С)=1, (АС)=1DEC А2) Ассемблер:DEC Rn;где п=0-700011rrr, где rrr=0 0 0-l l lКод:1 циклВремя:(Rn):=(Rn)-lАлгоритм:;(R1)=7FH,Пример:;(O3y[7F])=40H, (O3Y[7F])=00HDEC @R1DEC RlDEC @R1;(R1)=7EH,;(03У[7F])=3FH, (03Y[7F])=FFH3) Ассемблер:Код:Время:Алгоритм:Пример:DEC <direct>00010101 <direct address>1 цикл(direct):=(direct)-l4) Ассемблер:Код:Время:Алгоритм:Пример:DEC @Ri0001011i1 цикл((Ri)):=((R)-1)DEC SCON;(SCON)=A0H, (C)=l, (AC)=1;(SC0N)=9FH, (C)=l, (AC)=1; где i=0, l;(R1)=7FH,;(O3У[7F])=40H, (O3Y[7E])=00HDEC @R1;(03Y[7F])=3FHDEC Rl;(R1)=7EHDEC @R1;(O3У[7Е])=FFHПримечание: Если эта команда используется для изменения информации на выходе порта,значение, используемое как исходные данные, считывается из "защелки"' порта, а не с выводовБИС.Команда DIV ABКоманда "деление" делит 8-битовое целое без знака из аккумулятора А на 8-битовое целоебез знака в регистре В.
Аккумулятору присваивается целая часть частного (старшие разряды), арегистру В — остаток. Флаги переноса (С) и переполнения (OV) сбрасываются. Если (А) < (В), тофлаг дополнительного переноса (АС) не сбрасывается. Флаг переноса сбрасывается в любом случае.Ассемблер:DIV AB10000100Код:4 циклаВремя:(А):=((А)/(В))[15-8],Алгоритм:(В):=((А)/(В))[7-0],81Пусть аккумулятор содержит число 251 (0FBH или 11111011В),а регистр В - число 18 (12Н или 00010010В).После выполнения командыDIV ABв аккумуляторе будет число 13 (0DH или 00001101В), а в регистре В- число 17 (ПН или 00010001В), т.к.
251=(13*18)+17. Флаги С и 0Vбудут сброшены.Примечание: Если В содержит 00, то после команды DIV содержимое аккумулятора А ирегистра В будут не определены. Флаг переноса сбрасывается, а флаг переполнения устанавливается в "1".Пример:Команда DJNZ <байт>.<смещение>Команда "декремент и переход, если не равно нулю" выполняет вычитание "1" из указанной ячейки и осуществляет ветвление по вычисляемому адресу, если результат не равен нулю.Начальное значение 00Н перейдет в 0FFH. Адрес перехода (ветвления) вычисляется сложениемзначения смещения (со знаком), указанного Е, последнем байте команды, с содержимым счетчикакоманд, увеличенным на длину команды DJNZ.
На флаги эта команда не влияет и допускает следующие режимы адресации:1)регистровый2)прямой1) Ассемблер:DJNZ Rn,<метка>; где n=0-711011rrr <rel8>Код:2 циклаВремя:(РС):=(РС)+2,Алгоритм:(Rn):=(Rn)-l,если ((Rn)>0 или (Rn)<0), то (PC):=(PC)+<rel8>Пример:2) Ассемблер:Код:Время:Алгоритм:;(R2)=08H, (P1)=FFH (11111111В)LAB4: CPL PI.7;(R2)={07-00}DJNZ R2.LAB4;Эта последовательность команд переключает Р1.7;восемь раз и приводит к появлению четырех импульсов;на выводе БИС, соответствующем биту Р1.7.DJNZ <direct>, <метка>11010101<direct address> <rel8>2 цикла(РС):=(РС)+3,(direct) : = (directM, если ((direct)>0 или (direct)<0), то(PC):=(PC)+<rel8>Пример:DJNZ 40H, LAB1DJNZ 50H, LAB2DJNZ 60H, LAB3…..LAB1: CLR…..LAB2: DEC Rl;(ОЗУ[40])=01Н,(ОЗУ[50])=80Н, ;(ОЗУ[60])=25Н;(ОЗУ[40]):=00Н;(O3У[50]):=7FH;(ОЗУ[60]):=25Носуществился переход на меткуLAB2Примечание: Если команда DJNZ используется для изменения выхода порта, значение, используемое как операнд, считывается из "защелки" порта, а не с выводов БИС.Команда INC <байт>Команда "инкремент" выполняет прибавление "1" к указанной переменной ■•> не влияетна флаги.
Начальное значение 0FFH перейдет в 00H. Эта команда допускает четыре режима адресации:1) к аккумулятору2) регистровый3) прямой824) косвенно-регистровый1) Ассемблер:INC A00000100Код:1 циклВремя:(A):=(A)+1Алгоритм:Пример:2) Ассемблер:Код:Время:Алгоритм:Пример:3) Ассемблер:Код:Время:Алгоритм:Пример:4) Ассемблер:Код:Время:Алгоритм:Пример:INC АINC Rn00001rrr1 цикл(Rn):=(Rn)+l;(A)=1FH, (АС)=0;(А)=20Н, (АС)=0;где n = 0-7, где rrr = 000-111;(R4)=FFH, (C)=0, (AC)=0;(R4)=00H, (C)=0, (АС)=0INC R4INC <direct>00000101 <direct address>1 цикл(direct):=(direct)+lINC 43HINC @Ri;(ОЗУ[43])=22Н;(03У[43])=23Н; где i=0,l0000011i , где i= 0,l1 цикл((Ri)):=((Ri)+l);(R1)=41H, (O3У[41])=4FH, (AC)=0;(R1)=41H, (ОЗУ[41])=50H, (AC)=0INC @R1Примечание.
При использовании команды INC для изменения содержимого порта, величина, используемая как операнд, считывается из "защелки" порта, а не с выводов БИС.Команда INC DPTRКоманда "инкремент указателя данных" выполняет инкремент (прибавление "1") содержимого 16-битового указателя данных (DPTR). Прибавление "1" осуществляется к 16 битам, причемпереполнение младшего байта указателя данных (DPL) из FFH в 00Н приводит к инкрементустаршего байта указателя данных (DPH). На флаги эта команда не влияет.Ассемблер:INC DPTR10100011Код:2 циклаВремя:(DPTR):=(DPTR)+1Алгоритм:Пример:;(DPH)=12H, (DPL)=FEHINCINCINCDPTRDPTRDPTR;(DPH)=13H, (DPL)=01HКоманда JB <bit>.<rel8>Команда "переход, если бит установлен" выполняет переход по адресу ветвления, еслиуказанный бит равен'Ч", в противном случае выполняется следующая команда.
Адрес ветвлениявычисляется с помощью прибавления относительного смещения со знаком в третьем байте команды (ге18) к содержимому счетчика команд после прибавления к нему 3. Проверяемый бит не изменяется. Эта команда на флаги не влияет.Ассемблер:JB (bit),<метка>00100000 <bit address> <rel8>Код:2 циклаВремя:(РС):=(РС)+3,Алгоритм:если (bit)=l, то (PC):=(PC)+<rel8>Пример:;(А)=96Н (10010110В)JB ACC.2, LAB5……LAB5: INC A;эта команда обеспечивает;переход на метку LAB583Команда JBC <bit>.<геl8>Команда "переход, если бит установлен и сброс этого бита", выполняет ветвлениепо вычисляемому адресу, если бит равен "1". В противном случае выполняется следующаяза JBC команда. В любом случае указанный бит сбрасывается. Адрес перехода вычисляется сложением относительного смещения со знаком в третьем байте команды (ге18) и содержимого счетчика команд после прибавления к нему 3.
Эта команда не влияет на флаги.Ассемблер:Код:Время:Алгоритм:JBC (bit), <метка>00010000 <bit address> <rel8>2 цикла(РС):=(РС)+3,если (bit)=l, то (bit):=0, (PC):=(PC)+<rel8>;(А)=76Н (0111 0110В);Перехода на LAB6 нет, т.к.;(А[31]) = 0;переход на адрес,JBC ACC.2, LAB7;соответствующий метке LAB7.Примечание. Если эта команда используется для проверки бит порта, то значение,используемое как операнд, считывается из "защелки" порта, а не с вывода БИС.Команда JC <геl8>Команда "переход, если перенос установлен" выполняет ветвление по адресу, еслифлаг переноса равен "1", в противном случае выполняется следующая команда.
Адресветвления вычисляется с помощью сложения относительного смещения со знакомво втором байте команды (rel8) и содержимого счетчика команд, после прибавления кнему 2. Эта команда на флаги не влияет.Пример:JBC ACC.3, LAB6Ассемблер:Код:Время:Алгоритм:JC <метка>01000000 <геl8>2 цикла(РС):=(РС)+2,если (С)=1, то (РС):=(РС)+<ге18>Пример:JC LAB8CPL CLAB8: JC LAB9;(С)=0;нет перехода на метку LAB8; (С):=1;переход на метку LAB9, т.к.
(С)=1…LAB9: N0PКоманда JHP @A+DPTRКоманда "косвенный переход" складывает 8-битовое содержимое аккумулятора беззнака с 16-битовым указателем данных (DPTR) и загружает полученный результат в счетчик команд, содержимое которого является адресом для выборки следующей команды. 16битовое сложение выполняется по модулю 2 , перенос из младших восьми бит распространяется на старшие биты программного счетчика. Содержимое аккумулятора и указателя данных не изменяется. Эта команда на флаги не влияет.Ассемблер:Код:Время:Алгоритм:Пример:JMP @A+DPTR011100112 цикла(PC):=(A)[7-0]+(DPTR)[15-0];(РС)=034ЕН, (А)=86Н, DPTR)=0329H;(PC)=03AFH, (A)=86H, (DPTR)=0329HJMP @A+DPTRКоманда JNB <bit>, <rel8>Команда "переход, если бит не установлен" выполняет ветвление по адресу, еслиуказанный бит равен "нулю", в противном случае выполняется следующая команда Адресветвления вычисляется с помощью сложения относительного смещения со знаком в84третьем байте команды (геl8) и содержимого счетчика команд после прибавления к нему3.
Проверяемый бит не изменяется. Эта команда на флаги не влияет.Ассемблер:Код:Время:Алгоритм:Пример:JNB(bit), <метка>00110000 <bit address>2 цикла(РС):=(РС)+3, если (bit)=0 (РС):=(РС)+<rel8>JNB P1.3, LAB10JNB ACC.3, LAB11LAB11: INC A;(Р2)=САН (11001010В),; (А)=56Н (0101 0110В);нет перехода на LAB10;переход на метку LAB11Команда JNC <геl8>Команда "переход, если перенос не установлен" выполняет ветвление по адресу,если флаг переноса равен нулю, в противном случае выполняется следующая команда.Адрес ветвления вычисляется с помощью сложения относительного смещения со знакомво втором байте команды (ге18) и содержимого счетчика команд после прибавления к нему 2.
Флаг переноса не изменяется. Эта команда на другие флаги не влияет.Ассемблер:Код:Время:Алгоритм:Пример:JNC <метка>01010000 <геl8>2 цикла(PC):=(РС)+2, если (С)=0, то (PC):=(PC)+<rel8>JNC LAB12CPL СLAB12: JNC LAB13;(С)=1;нет перехода на LAB12;(С)=0;переход на метку LAB13Команда JNZ <геl8>Команда "переход, если содержимое аккумулятора не равно нулю" выполняетветвление по адресу, если хотя бы один бит аккумулятора равен "1", в противном случаевыполняется следующая команда. Адрес ветвления вычисляется сложением относительного смещения со знаком во втором байте команды (rel8) и содержимого счетчика команд(PC) после прибавления к нему 2. Содержимое аккумулятора не изменяется.
Эта командана флаги не влияет.Ассемблер:Код:Время:Алгоритм:Пример:JNZ <метка>01110000 <rеl8>2 цикла(РС):=(РС)+2, если (A)=0 то (РС):=(РС)+<ге18>JNZ LAB14INC ALAB14: JNZ LAB15…LAB15: NOP;(А)=00Н;нет перехода на LAB14;переход на метку LAB15Команда JZ <геl8>Команда "переход, если содержимое аккумулятора равно "0" выполняет ветвлениепо адресу, если все биты аккумулятора равны "0", в противном случае выполняется следующая команда.
Адрес ветвления вычисляется сложением относительного смещения сознаком во втором байте команды (rel8) и содержимым счетчика команд после прибавления к нему 2. Содержимое аккумулятора не изменяется. Эта команда на флаги не влияет.Ассемблер:Код:Время:Алгоритм:Пример:JZ <метка>01100000<rе18>2 цикла(РС):=(РС)+2, если (А)=0, то (РС):=(РС)+<ге18>;(А)=01Н85;нет перехода на LAB16JZ LAB16DEC ALAB16: JZ LAB17LAB17: CLR А;переход на метку LAB17Команда LCALL <addr16>Команда "длинный вызов" вызывает подпрограмму, находящуюся по указанномуадресу. По команде LCALL к счетчику команд (PC) прибавляется 3 для получения адресаследующей команды и после этого полученный 16-битовый результат помещается в СТЕК(сначала следует младший байт, за ним — старший), а содержимое указателя СТЕКа (SP)увеличивается на 2. Затем старший и младший байты счетчика команд загружаются соответственно вторым и третьим байтами команды LCALL.