Упражнения по решению задач
Задача 1. Какие выводы микроконтроллера используются при выборке очередного байта из внешней памяти программ?
Ответ. Младший байт адреса передается через линии порта Р0 и запоминается во внешнем регистре по сигналу, формируемому на выводе ALE. Старший байт адреса передается через линии порта Р2. Читается очередной байт команды через линии порта Р0 по сигналу, формируемому на выводе PME.
Задача 2. Какие выводы микроконтроллера задействованы при выполнении команды MOVX @R0,A?
Ответ. При выполнении этой команды содержимое аккумулятора записывается в ячейку внешней памяти данных объемом не более 256 байт, косвенно адресуемую содержимым регистра R0. Адрес ячейки защелкивается во внешнем регистре с линий порта Р0 по сигналу, формируемому на выводе ALE. Запись осуществляется через линии порта Р0 по сигналу WR, формируемому на шестом выводе порта Р3.
Задача 3. Какие выводы микроконтроллера задействованы при работе с внутренней памятью программ?
Ответ.Такой режим устанавливается подачей высокого уровня напряжения на вывод VPP. Порты Р0 и Р2 остаются свободными для других применений, так как адреса и данные передаются по внутренней магистрали микроконтроллера.
Задача 4. Какой из битов PSW программно доступен только по чтению?
Ответ.Это может быть только бит паритета Р. Его значение жестко определяется содержимым аккумулятора. В 9-разрядном слове, состоящем из восьми разрядов аккумулятора и бита Р, всегда содержится четное число единичных битов. При обнулении аккумулятора флаг Р примет нулевое значение.
Задача 5. Можно ли использовать порт Р3 для реализации альтернативных функций после выполнения команды MOV P3,#0?
Ответ.Нет, нельзя. Альтернативная функция любой из линий порта Р3 реализуется только в том случае, если в соответствующем этой линии триггере-защелке содержится 1. После выполнения данной команды во все триггеры порта будут записаны нули, выходные ключи порта будут открыты и на всех линиях Р3 будут уровни логического 0.
Задача 6. Содержимое каких регистров МК51 изменится, если сразу после сброса будет выполнена команда LCALL BEGIN?
Ответ. Трехбайтовая команда LCALL вызывает подпрограмму BEGIN. При сбросе в указатель стека SP загружается число 7. По команде LCALL к содержимому счетчика команд РС прибавляется 3 для получения адреса следующей команды и после этого полученный 16-битовый результат (в нашем случае 0003Н) помещается в стек (03Н — в восьмую, а 00Н — в девятую ячейку резидентной памяти данных). Содержимое указателя стека увеличивается на 2. Затем старший и младший байты счетчика команд загружаются соответственно вторым и третьим байтом команды LCALL, т.е. начальным адресом подпрограммы BEGIN.
Задача 7. Определите прямой адрес пятого бита аккумулятора.
Решение.Прямой адрес младшего бита регистра, допускающего адресацию отдельных бит, совпадает с прямым адресом самого регистра. Добавляя число 5 к прямому адресу АСС, равному 0Е0Н, получим прямой адрес бита АСС.5, равный 0Е5Н. Прямая побитовая адресация используется для обращения к отдельно адресуемым 128 битам, расположенным в ячейках резидентной памяти данных с адресами 20Н-2FH, и к отдельно адресуемым битам регистров специального назначения.
Задача 8. Можно ли использовать команды работы с битами при обращении к младшему биту регистра PCON, имеющему символическое обозначение IDL (бит холостого хода)?
Ответ.Нельзя, так как регистр PCON не допускает адресацию отдельных бит. Такую адресацию допускают только 11 регистров специальных функций из 21.
Задача 9. Какие регистры используются в качестве указателей данных при косвенно-регистровой адресации?
Ответ.При обращении к ячейкам внутреннего ОЗУ данных для этой цели используются регистры R0, R1 выбранного банка регистров. Они же используются для выборки ячейки из блока в 256 байт внешней памяти данных. При обращении к любой ячейке адресного пространства внешней памяти данных объемом до 64 Кбайт используется 16-разрядный регистр DPTR. Любой байт из таблицы памяти программ может быть выбран по адресу, определяемому суммой содержимого DPTR или РС и содержимого аккумулятора.
Задача 10. Какие методы адресации можно использовать при обращении к ячейке резидентной памяти данных с адресом 18Н?
Ответ.Кроме прямой байтовой адресации (как, например, в команде MOV 18H,#100), можно использовать косвенно-регистровую (MOV @R1,#100 если содержимое регистра-указателя R1 равно 18Н) или регистровую (MOV R0,#100 если выбран банк РОН3 установкой в 1 битов RS0 и RS1 слова состояния программы PSW).
Задача 11.Определить машинные коды команды ANL A,B.
Ответ. Регистр-расширитель аккумулятора В допускает только прямую байтовую адресацию, следовательно, это двухбайтовая команда типа 3. Первый байт является кодом операции (55Н), второй байт — прямым адресом регистра В (F0H).
Задача 12. Транслировать команду CLR F0.
Ответ.F0 — символическое имя бита PSW.5. Следовательно, это двухбайтовая команда типа 4. Код операции — С2Н, прямой адрес бита D5H определяем, прибавляя число 5 к прямому адресу регистра PSW D0H.
Задача 13. Определить второй байт команды SJMP $.
Решение.Команда «короткий переход»« выполняет безусловный переход в программе по указанному адресу. Знак $ в поле операндов используется для обозначения текущего содержимого программного счетчика РС (он равен адресу первого байта рассматриваемой команды). В данном случае речь идет о двухбайтовой команде типа 5. Второй байт команды — относительное смещение со знаком (rel) от начального адреса следующей команды до адреса, указанного в команде. В данном примере rel=–2=FEH (rel записывается в дополнительном коде и находится в диапазоне от –128 до +127).
Задача 14. Транслировать команду AJMP 1000.
Решение. Команда «абсолютный переход» передает управление по адресу внутри текущей страницы памяти программ объемом 2 Кбайт. Это двухбайтовая команда типа 6. Заменив ее эквивалентной командой AJMP 3E8H, записываем второй байт Е8Н. По таблице машинных кодов для модели AJMP 3xxH находим первый байт команды 61Н.
Задача 15. Определить тип команды MOV B,P0.
Решение.Это трехбайтовая команда типа 9 (общий вид команды MOV add,ads). Второй байт команды 80Н — прямой адрес порта Р0 (адрес источника ads). Третий байт команды F0H — прямой адрес регистра В (адрес приемника add).
Задача 16. Что происходит при выполнении команды LCALL 1AB7H?
Решение.Это трехбайтовая команда типа 12, вызывающая подпрограмму, находящуюся по указанному адресу. По команде LCALL к программному счетчику РС прибавляется 3 для получения адреса следующей команды и после этого полученный 16-разрядный результат помещается в стек (в ячейку ((SP+1)) загружается младший байт, в ячейку ((SP+2)) — старший байт. Затем старший и младший байты РС загружаются соответственно вторым (1АН) и третьим (В7Н) байтами команды LCALL. Выполнение программы продолжается командой, находящейся по указанному адресу.
Задача 17. Что происходит при выполнении команды CJNE A,#50,M1?
Решение.Это трехбайтовая команда типа 10. Происходит сравнение содержимого аккумулятора с константой, указанной во втором байте команды (32Н) и выполняется переход на метку М1, если операнды не равны. Адрес перехода вычисляется при помощи сложения значения (со знаком), указанного в третьем байте команды (rel), с содержимым счетчика команд РС после увеличения его на три. Флаг переноса С устанавливается в 1, если содержимое аккумулятора меньше константы. В противном случае перенос сбрасывается. Команда не оказывает влияния на операнды. При равенстве операндов выполняется следующая команда программы.
Задача 18. Транслировать команду JBC T1,$+10?
Решение.Это трехбайтовая команда типа 11. Код операции 10Н. Второй байт команды В5Н соответствует прямому адресу бита Т1 (Р3.5). Третий байт команды 07Н показывает, сколько шагов необходимо сделать от адреса следующей команды до адреса перехода (rel=+7). Команда осуществляет переход по указанному адресу, если бит установлен, с последующим сбросом бита. В противном случае выполняется следующая за JBC команда.
Задача 19. Оценить результат выполнения команды ADD A,R6. До выполнения команды (А)=С3Н, (R6)=AAH.
Решение.Команда складывает содержимое аккумулятора и регистра R6, оставляя результат в аккумуляторе: (А)=C3H+AAH= =6DH. При этом устанавливаются флаги: AC=0, C=1, OV=1. При сложении целых без знака флаг переноса С=1 указывает на появление переполнения (сумма больше 255). При сложении целых чисел со знаком флаг OV=1 указывает на отрицательную величину, полученную при суммировании двух положительных операндов или на положительную сумму для двух отрицательных операндов (как в нашем случае).
Задача 20.Можно ли с помощью команды DA A преобразовать двоичное число в аккумуляторе в двоично-десятичный код?
Ответ. Нет, нельзя. Команда «десятичная коррекция аккумулятора для сложения» вместе с предшествующей ей командой ADD или ADDC используется для сложения чисел, представленных в двоично-десятичном формате.
Например, после выполнения команд
MOV A,#37H
MOV 70,#48H
ADD A,70
DA A
в аккумуляторе получим число 85Н, которое можно трактовать как двоично-десятичный код десятичного числа 85, равного сумме десятичных чисел 37 и 48, предварительно записанных в аккумулятор и семидесятую ячейку резидентной памяти данных в двоично-десятичном коде.
Команда DA A корректирует результат предварительного сложения операндов, добавляя 06Н, 60Н или 66Н в зависимости от начального состояния аккумулятора и слова состояния программы РSW (флагов С и АС).
Задача 21. Как выполняется команда MUL AB?
Ответ. Команда «умножение» умножает 8-битовые целые числа без знака из аккумулятора и регистра В. Старший байт 16-битового произведения помещается в регистр В, а младший — в аккумулятор. Флаг переноса С всегда сбрасывается. Флаг переполнения OV устанавливается, если результат больше 255. Время выполнения команды — четыре машинных цикла.
Пусть (А)=(В)=100=64Н. Их произведение 10000=2710Н. После выполнения команды MUL AB в регистре В будет 27Н, в аккумуляторе — 10Н. Флаг С=0, флаг OV=1.
Задача 22. Как выполняется команда DIV AB?
Ответ. Команда «деление» делит 8-битовое целое число без знака из аккумулятора А на 8-битовое целое число без знака в регистре В. Аккумулятору присваивается целая часть частного (старшие разряды), а регистру В — остаток. Флаги С и OV сбрасываются. При делении на 0 флаг OV устанавливается, а содержимое А и В становится неопределенным. Время выполнения команды — четыре машинных цикла.
Пусть аккумулятор содержит число 251 (0FBH или 11111011В), а регистр В — число 18 (12Н или 00010010В). После выполнения команды DIV AB в аккумуляторе будет число 13 (0DH или 00001101В), а в регистре В — число17 (11Н или 00010001В), т.к. 251=(13*18)+17. Флаги С и OV будут сброшены.
Задача 23. Инвертировать сигналы, выводимые в младшую и старшую линии порта Р1.
Ответ. Это можно сделать, последовательно выполнив команды инверсии битов CPL P1.0 и CPL P1.7. Одновременно инвертировать оба бита можно логической командой XRL P1,#10000001B. При выполнении команд изменяется содержимое триггера-защелки порта.
Задача 24. Как выполняется команда SUBB A,R0?
Ответ. Команда «вычитание с заемом» вычитает из аккумулятора содержимое R0 вместе с флагом переноса, засылая результат в аккумулятор. Эта команда устанавливает флаг переноса С (заема), если при вычитании для бита 7 необходим заем, в противном случае флаг переноса сбрасывается. Флаг АС устанавливается, если необходим заем для бита 3. Флаг переполнения OV устанавливается, если заем необходим для бита 6, но его нет для бита 7, или есть для бита 7, но нет для бита 6.
При вычитании целых чисел со знаком OV указывает на отрицательное число, которое получается при вычитании отрицательной величины из положительной, или на положительное число, которое получается при вычитании положительного числа из отрицательного.
Задача 25.Оценить время выполнения записанных с нулевого адреса команд МК51 при частоте кварца 12 МГц.
ORG 0
74 05 MOV A,#5 ; 1
83 MOVC A,@A+PC ; 2
D5 E0 FD DJNZ ACC,$ ; 2
D5 F0 F9 DJNZ B,2 ; 2
Решение.Слева от мнемоники приведены результаты трансляции команд, в поле комментария – время выполнения команд в машинных циклах. Первый байт содержит код операции. 05 – константа 5, Е0 – прямой адрес аккумулятора, F0 – прямой адрес регистра В. FD – относительное смещение (-3) от адреса первого байта следующей команды до первого байта данной команды. F9 – относительное смещение от адреса следующей команды до ячейки с адресом 2, равное (-6). При выполнении второй команды в аккумулятор пересылается байт из ячейки памяти программ, адрес которой определяется путем суммирования содержимого А и РС. В это время в аккумуляторе находится число 5, а в программном счетчике подготовлен адрес следующей команды, т.е. 3. В восьмой ячейке находится число F9=249. Следующая команда при первом проходе выполнится 249 раз. После сброса в регистре В находится 0. Поэтому последняя команда будет выполняться 256 раз. При этом 255 раз будет осуществляться возврат на вторую команду. При ее выполнении в аккумулятор будет попадать число D5=213. Столько раз в цикле каждый раз будет выполняться предпоследняя команда.
Один машинный цикл равен 1 мкс. В итоге получаем t=1+2*256+(2*249+2*255*213)+2*256=110153 мкс.
Задача 26. Оценить время выполнения команд после сброса МК51и содержимое аккумулятора при частоте кварца 12 МГц.
ORG 0
0,1 MOV A,#7
2,3,4 MOV B,#5
5 MOVC A,@A+PC ; (A)=F8=248
6,7,8 DJNZ ACC,$
9,10 PUSH ACC
11,12,13 DJNZ B,6 ; rel=F8
14,15 MOV A,SP
16,17 ADD A,10
Решение.Слева от мнемоники команд записаны адреса ячеек памяти программ, в которых расположены байты, начиная с нулевой ячейки. При выполнении третьей команды в аккумулятор попадает содержимое 13 ячейки, т.е. число F8=248 (относительное смещение от 14 до 6 ячейки). Столько раз выполняется при первом проходе следующая команда, после чего содержимое аккумулятора обнуляется. Команда PUSH ACC загружает в стек (в 8 ячейку, т.к. после сброса в указателе стека записано число 7) ноль. Команда DJNZ B,6 выполняется 5 раз. При этом 4 раза осуществляется возврат на 6 ячейку при нулевом содержимом аккумулятора, в результате чего обнуляются еще 4 ячейки стека, в том числе и десятая ячейка. После пятикратного выполнения команды PUSH ACC в указателе стека находится число 12. Именно оно и определяет содержимое аккумулятора после выполнения последней команды.
Ответ:1+2+2+(2*248+2*4*256)+2*5+2*5+1+1=2571 мкс, А=12=0CH
Задача 27. Оценить время выполнения команд после сброса при частоте кварца 12 МГц.
ORG 0
MOV A,#22H ;1 (А)=34
PUSH ACC ;2
MOV B,SP ;2 (В)=8
DIV AB ;4 (А)=4 (В)=2
ACALL 1 ;2+2
MOVC @A+PC ;2 (А)=253
DIV AB ;253/2 (А)=126 (В)=1
MUL AB ;(А)=126 (В)=0
M1: DJNZ ACC,$ ;2*126+2*255*256
DJNZ B,M1 ;2*256
Решение.Число 22Н находится в первой ячейке и соответствует машинному коду команды RET. Она выполняется при вызове подпрограммы ACALL 1. При выполнении команды MOVC @A+PC в аккумулятор записывается третий байт команды DJNZ ACC,$ (относительное смещение от адреса первого байта следующей команды до метки М1 (-3)=253). Основное время выполнения программы определяют две последние команды. Команда DJNZ B,M1 выполняется 256 раз, так как в регистре В находится 0 при первом ее выполнении. Команда DJNZ ACC,$ первый раз выполнится 126 раз, а затем еще в цикле 255 раз по 256 раз.
Ответ: 1+2+2+4+4+2+4+4+252+130560+512=131347 мкс.
Задача 28. Оценить содержимое аккумулятора и время выполнения команд при частоте кварца 12 МГц
ORG 0
SJMP M1 ;2
DELAY: DJNZ ACC,$ ;2*192
MOV A,SP ;1 (A)=10
RET ;2
M1: MOVC A,@A+PC ;2 (A)=0C0H=192
PUSH ACC ;2
ACALL DELAY ;2
POP B ;2 (B)=192
MUL AB ;4 10*192=1920
; (B)=7 (A)=128=80H
Решение.Время выполнения команд в машинных циклах приведено в поле комментария. После сброса аккумулятор обнулен. Поэтому, при выполнении команды MOVC A,@A+PC в аккумулятор попадает машинный код С0 следующей команды, адрес которой находится в программном счетчике. После выполнения команды PUSH ACC в указателе стека 8, а после вызова подпрограммы DELAY содержимое указателя стека становится равным 10. Именно оно пересылается в аккумулятор при выполнении подпрограммы. В регистр В из стека извлекается число С0Н=192. При выполнении команды умножения старший байт определяет содержимое регистра В, а в аккумулятор записывается младший байт произведения. Все команды программы выполняются однократно, кроме второй команды, которая в цикле выполняется 192 раза.
Ответ: 17+2*192=401 мкс, (A)=128=80H
Задача 29. Определить время выполнения программы после сброса МК51 при частоте кварца 12 МГц.
ORG 0
C0 04 PUSH 4 ;2
D5 81 FC DJNZ SP,1 ;2
D5 E0 FA DJNZ ACC,2 ;2
04 INC A ;1
Решение.При выполнении первой команды содержимое указателя стека увеличивается на единицу. Поэтому вторая команда выполнится 8 раз. При этом 7 раз реализуется переход к первой ячейке и выполнение команды INC A (КОП=04). По завершению цикла SP=0.
Следующая команда выполняется при А=7. Содержимое аккумулятора декрементируется и реализуется переход ко второй команде (начинающейся со второй ячейки), которая выполнится 256 раз, причем 255 раз в этом цикле выполнится и команда INC A, что приведет к дополнительному декременту аккумулятора (А=5).
Через следующий такой цикл А=3, а еще через цикл А=1, после чего по одному разу выполнятся последние две команды.
Ответ: 2+8*2+7*1+3(2+256*2+255*1)+2+1=2335 мкс
Задача 30. Оценить время выполнения команд после сброса МК51 при частоте кварца 12 МГц.
ORG 0
MOV B,SP ;2
M1: MOV A,SP ;1
PUSH ACC ;2
DJNZ B,M1 ;2
ADD A,10 ;1
DJNZ ACC,$ ;2
Решение.Цикл с возвратом на метку М1 реализуется 7 раз. Ячейки резидентной памяти данных, начиная с восьмой, заполняются числами натурального ряда, начиная с 7, т.к. при выполнении команды PUSH ACC содержимое указателя стека инкрементируется. По завершении цикла в аккумуляторе будет число 13, а в десятой ячейке РПД число 9. Поэтому последняя команда выполнится 21 раз.
Ответ: 2+(1+2+2)7+1+2(13+9)=82 мкс
Дата добавления: 2016-01-09; просмотров: 1781;