MCS-51 (1031646), страница 19
Текст из файла (страница 19)
Выполнение программы продолжается командой, находящейся по полученному адресу. Подпрограмма, следовательно,может начинаться в любом месте адресного пространства памяти программ объемом до 64Кбайт. Эта команда на флаги не влияет.Ассемблер:Код:Время:Алгоритм:LCALL <метка>00010010 addr[15-8] addr[7-0]2 цикла(РС):=(РС)+3(SP):=(SP)+1((SP)):=(PC[7-0])(SP):=(SP)+1((SP)):=(PC[15-8])(PC):=<adddr[15-0]>Пример:LCALL PRN;(SP)=07H,;метке PRN соответствует адрес 1234Н,;по адресу 0126Н находится команда;LCALL;(SP)=09H, (PC)=1234H,;(ОЗУ[08])=26Н, (ОЗУ[09])=01НКоманда LJMP <addr16>Команда "длинный переход" выполняет безусловный переход по указанному адресу, загружая старший и младший байты счетчика команд (PC) соответственно вторым итретьим байтами, находящимися в коде команды. Адрес перехода, таким образом, можетнаходиться по любому адресу пространства памяти программ в 64 Кбайт. Эта команда нафлаги не влияет.Ассемблер:LJMP <метка>Код:Время:Алгоритм:00000010 addr[15-8] addr[7-0]2 цикла(PC):=<addr[15-0]>Команда MOV <байт-назначения>, <байт-источника>Команда "переслать переменную-байт" пересылает переменную-байт, указаннуюво втором операнде, в ячейку, указанную в первом операнде.
Содержимое байта источника не изменяется. Эта команда на флаги и другие регистры не влияет. Команда "MOV" допускает 15 комбинаций адресации байта-источника и байта-назначения.1)Ассемблер:Код:MOV A,Rn; где n=0-711101rrr, где rrr=000-111Время:Алгоритм:Пример:1 цикл(A):=(Rn)Ассемблер:Код:MOV A, <direct>11100101 <direct address>MOV A,R42);(A)=FAH, (R4)=93H;(A)=93H, (R4)=93H86Время:Алгоритм:Пример:1 цикл(A):=(direct);(А)=93Н, (ОЗУ[40])=10Н, (R0)=40H;(A)=10H, (ОЗУ[40])=10H, (R0)=40HMOV A, 40H3)Ассемблер:Код:Время:Алгоритм:Пример:MOV A,@Ri1110011i1 цикл(A):=((Ri)); где i=0,lАссемблер:Код:Время:Алгоритм:Пример:MOV A, #data01110100 <#data8>1 цикл(A):=<#data8>MOV A,@R04)5)Ассемблер:Код:Время:Алгоритм:Пример:;(А)=С9Н (11001001В);(A)=37H (00110111B)MOV A,#37HMOV Rn, A; где n=0-711111rrr <#data8> , где rrr=000-1111 цикл(Rn):=(A)MOV R0, A6)Ассемблер:Код:Время:Алгоритм:Пример:8)Ассемблер:Код:Время:Алгоритм:Пример:Ассемблер:Код:Время:Алгоритм:Пример:(Rn):=(direct)Ассемблер:Код:Время:Алгоритм:Пример:MOV R0, #49HMOV <direct>, A(direct):= (A);(P0)=FFH, (A)=4BH;(P0)=4BH, (A)=4BHMOV <direct>,Rn; где n=0-710001rrr <direct address> где rrr=000-111 – номер регистра2 циклa(direct):=(Rn);(PSW)=C2H, (R7)=57H;(PSW)=57H, (R7)=57HMOV <direct>, <direct>10000101 <direct address> <direct address>2 циклa(direct):= (direct)MOV 48H.45H11) Ассемблер:Код:Время:;(R0)=0F5H;(R0)=49H11110101 <direct address>1 циклMOV PSW, R710) Ассемблер:Код:Время:Алгоритм:Пример:;(R0)=39H, (P2)=0F2H;(R0)=F2HMOV Rn, #data ; где n=0-701111rrr <#data8>1 цикл(Rn):=<#data8>MOV P0,A9);(А)=38Н, (R0)=42H;(А)=38Н; (R0)=38HMOV Rn,<direct> где n=0-710101rrr <direct address>2 циклaMOV R0, P27);(A)=10H, (R0)=41H, (03У[41])=0САН;(A)=CAH, (R0)=41H, (03У[41])=0CAH;(03У[45])=ЗЗН, (O3У [48])=0DEH;(03У[45])=ЗЗН, (03У[48])=ЗЗНMOV <direct>, @Ri; где i=0,l1000011i <direct address>2 циклa87Алгоритм:Пример:(direct):=((Ri))(R1)=49H, (ОЗУ[49])=0ЕЗН;(O3 У [5l])=0E3H, (03У[49])=0E3HMOV 51Н, @Ri12) Ассемблер:Код:Время:Алгоритм:Пример:MOV <direct>, #data01110101 <direct address> #data82 циклa(direct):=<#data8>;(O3У [5F])=9BH;(O3У [5F])=07HMOV 5FH, #07H13) Ассемблер:Код:Время:Алгоритм:Пример:MOV @Ri,A1111011i1 цикл;где i=0,l, где i=0,l((Ri)):=(A);(R1)=48H, (03У[48])=75Н, (A)=0BDH;(O3У[48])=0BDHMOV @R1, A14) Ассемблер:Код:Время:Алгоритм:Пример:MOV @Ri,<direct> ; где i=0,l1010011i <direct address>2 циклa15) Ассемблер:Код:Время:Алгоритм:Пример:MOV @Ri,#data0111011i1 цикл((Ri)):=(direct)MOV @R0,P0;(R0)=51H, (ОЗУ[51])=0ЕЗН, (Р0)=0АСН;(ОЗУ[51])=0АСН; где i=0,l((Ri)):=<#data8>MOV @R1, #0A9H;(O3У[7Е])=67Н, (R1)=7EH;(O3У[7E])=0A9H, (Rl)=7EH УКоманда MOV <бит назначения>.<бит источника>Команда "переслать бит данных" битовую переменную, указанную во втором байте, копирует в разряд, который указан в первом операнде.
Одним из операндов долженбыть флаг переноса С, а другим может быть любой бит, к которому возможна прямая адресация.1)Ассемблер:Код:Время:Алгоритм:MOV C, <bit>10100010 <bit address>1 цикл(C):=(bit)Пример:2)Ассемблер:Код:Время:Алгоритм:Пример:MOV C.P3.0MOV <bit>,C;(С)=0, (P3)=D5H (11010101B);С:=1MOV С.РЗ.З ;С:=0 MOV С,Р3.7 ;С:=110010010 <bit address>2 цикла(bit):=(C)(C)=l, (P0)= 20H (00100000B)MOV P0.1.CMOV P0.2,CMOV P0.3,C(C)=l, (P0)=2EH (00101110B)Команда MOV DPTR.#datal6Команда "загрузить указатель данных 16-битовой константой" загружает указательданных DPTR 16-битовой константой, указанной во втором и третьем байтах команды.Второй байт команды загружается в старший байт указателя данных (DPH), а третий байт— в младший байт указателя данных (DPL).
Эта команда на флаги не влияет и являетсяединственной командой, которая одновременно загружает 16 бит данных.88Ассемблер:Код:Время:Алгоритм:Пример:MOV DPTR, #<datal6>10010000 #<data[15-8]> #<data[7-0]>2 цикла(DPTR):= #data[15-0],причем, DPH:=#data[15-8], DPL:=#data[7-0];(DPTR)=01FDH;(DPTR)=1234H,MOV DPTR,#1234H;(DPH)=12H, (DPL)=34HКоманда MOVC A.@A+(<R16>)<R16> — 16-разрядный регистр.Команда "переслать байт из памяти программ" загружает аккумулятор байтом кодаили константой из памяти программы. Адрес считываемого байта вычисляется как сумма8-битового исходного содержимого аккумулятора без знака и содержимого 16-битовогорегистра. В качестве 16-битового регистра может быть:1)указатель данных DPTR;2)счетчик команд PC.В случае, когда используется PC, он увеличивается до адреса следующей командыперед тем, как его содержимое складывается с содержимым аккумулятора.
16-битовоесложение выполняется так, что перенос из младших восьми бит может распространятьсячерез старшие биты. Эта команда на флаги не влияет.1)Ассемблер:Код:Время:Алгоритм:Пример:MOVC A,@A+DPTR100100112 циклаАссемблер:Код:Время:Алгоритм:Пример:MOVC А,@А+РС100000112 цикла(A):=((A)+(DPTR));(А)=1ВН, (DPTR)=1020H,;(ПЗУ[103В])=48Н,;(A)=48H, (DPTR)=1020HMOVC A,@A+DPTR2)(А): = ((А) + (РС)MOVC A,@A+PC;(A)=FAH, (PC)=0289;(ПЗУ[0384])=9ВН;(А)=9ВН, (РС)=028АНкоманда МОVХ <байт приемника), <байт источника)Команда "переслать во внешнюю память (из внешней памяти) данных" пересылаетданные между аккумулятором и байтом внешней памяти данных.
Имеется два типа команд, которые отличаются тем, что обеспечивают 8-битовый или 16-битовый косвенныйадрес внешнего ОЗУ данных.В первом случае содержимое R0 или R1 в текущем банке регистров обеспечивает8-битовый адрес, который мультиплексируется с данными порта Р0. Для расширения дешифрации ввода-вывода или адресации небольшого массива ОЗУ достаточно восьми битадресации. Если применяются ОЗУ, немного больше чем 256 байт, то для фиксации старших битов адреса можно использовать любые другие выходы портов, которые переключаются командой, стоящей перед командой MOVX.Во втором случае, при выполнении команды MOVX указатель данных DPTR генерирует 16-битовый адрес.
Порт Р2 выводит старшие восемь бит адреса (DPH), а порт Р0мультиплексирует младшие 8 бит адреса (DPL) с данными. Эта форма является эффективной при доступе к большим массивам данных (до 64К байт), так как для установки портоввывода не требуется дополнительных команд.1)Ассемблер:Код:MOVX A,@Ri1110001i; где i=0,189Время:Алгоритм:Пример:2 цикла(A):=((Ri));(А)=32Н, (R0)=83H, ячейка;внешнего ОЗУ по адресу 83Н;содержит В6Н(A)=B6H, (R0)=83HMOVX A,@R02)3)Ассемблер:Код:Время:Алгоритм:Пример:MOVX A,@DPTR111000002 циклаАссемблер:Код:Время:Алгоритм:Пример:MOVX @Ri,A1111001i2 цикла(A):=((DPTR))MOVX A,@DPTR;(A)=5CH, (DPTR)=2АВЕН,;ячейка внешнего ОЗУ по адресу;2АВЕН содержит 72Н;(A)=72H, (DPTR)=2ABEH; где i=0,l((Ri)):=(A)MOVX @R1,A4)Ассемблер:Код:Время:Алгоритм:Пример:;(А)=95Н, (R1)=FDH,;ячейка внешнего ОЗУ с адресом;FDH содержит 00;(A)=95H, (Rl)=FDH,;ячейка внешнего ОЗУ с адресом;FDH содержит 95НMOVX @DPTR, A111100002 цикла((DPTR)):=(A)MOVX@DPTR, A;(А)=97Н, (DPTR)=1FFFH,;ячейка внешнего ОЗУ с адресом;1FFFK содержит 00;(А)=97Н,;ячейка внешнего ОЗУ с адресом;1FFFH содержит 97НКоманда MUL ABКоманда "умножение" умножает 8-битовые целые числа без знака из аккумулятораи регистра В.
Старший байт 16-битового произведения помещается в регистр В, младший— в аккумулятор А. Если результат произведения больше чем 0FFН(255), то устанавливается флаг переполнения (0V), в противном случае он сбрасывается. Флаг переноса всегдасбрасывается.Ассемблер:Код:Время:Алгоритм:Пример:MUL АВ101001004 цикла(А)[7-0]:=(А)*(В),(В)[15-8]:=(А)*(В)а)MUL АВб)MUL АВ;(А)=50Н (50H=80DEC), (C)=l,;(B)=0A0H (A0H=160 DEC), (OV)=0;(А)=00Н, (В)=32Н, (С)=0, (OV)=l;(А)=2НН, (OV)=1, (B)=06H, (С)=1A)=0D8H, (B)=00H, (OV)=0, (C)=0Команда NOPКоманда "нет операции" выполняет холостой ход и не влияет на регистры и флаги,кроме как на счетчик команд (PC).90Ассемблер:Код:Время:Алгоритм:Пример:NOP000000001 цикл(РС):=(РС)+1Пусть требуется создать отрицательный выходнойимпульс на порте Р1[6] длительностью 3 цикла.
Этовыполнит следующая последовательность команд:CLRP1.6;Р1[6]:=0NOPNOPNOPSETB P1.6;Р1[6]:=1Команда ORL <байт назначяния>, <байт источника>Команда "логическое "ИЛИ" для переменных-байтов" выполняет операцию логического "ИЛИ" над битами указанных переменных, записывая результат в байт назначения. Эта команда на флаги не влияет.
Допускается шесть комбинаций режимов адресации:— если байтом назначения является аккумулятор:1) регистровый2) прямой3) косвенно-регистровый4) непосредственный— если байтом назначения является прямой адрес:5) к аккумулятору6) к константе1)2)Ассемблер:Код:Время:Алгоритм:Пример:ORL A, Rn; где n=0-701001rrr, где rrr=000-1111 циклАссемблер:Код:Время:Алгоритм:Пример:ORL A,<direct>01000101 <direct address>1 цикл(А):=(А) OR (Rn), где OR - операция логического "ИЛИ";(А)=15Н, (R5)=6CH;(A)=7DH, (R5)=6CHORL A,R5(А):=(А) OR (direct);(А)=84Н, (PSW)=C2H;(A)=C6H, (PSW)=C2HORL A.PSW3)Ассемблер:Код:Время:Алгоритм:Пример:ORL A,@Ri0100011i1 цикл; где i=0,lАссемблер:Код:Время:Алгоритм:Пример:ORL A,#<data>01000100 #<data8>1 цикл(А):=(А) OR ((Ri))ORL A,@R04)5)Ассемблер:Код:Время:Алгоритм:Пример:;(А)=52Н, (R0)=6DH, (03У[6D])=49H;(A)=5BH, (03У[6D])=49H(А):=(А) OR #<data>ORL A, #0AHORL (direct),A01000010 <direct address>1 цикл;(A)=8FH;(A)=FAH(direct):=(direct) OR (A);(A)=34H, (IP)=23H916)Ассемблер:Код:Время:Алгоритм:Пример:ORL IP,AORL (direct),#<data>;(IP)=37H, (A)=34H01000011 < direct address> #<data8>1 цикл(direct):=(direct) OR #<data>;(P1)=00H;(P1)=11000100B (C4H)ORL P1,#0C4HПримечание.