ПРИМЕРЫ РЕШЕНИЯ ОЛИМПИАДНЫХ ЗАДАЧ

        1. Оценить время выполнения команд МК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) от адреса первого байта следующей команды до первого байта данной команды. FE - относительное смещение от адреса следующей команды до ячейки с адресом 2, равное (-6). При выполнении второй команды в аккумулятор пересылается байт из ячейки памяти программ, адрес которой определяется путем суммирования содержимого А и РС. В это время в аккумуляторе находится число 5, а в программном счетчике подготовлен адрес следующей команды, т.е. 3. В восьмой ячейке находится число F9=249. Следующая команда при первом проходе выполнится 249 раз. После сброса в регистре В находится 0. Поэтому последняя команда будет выполняться 256 раз. При этом 255 раз будет осуществляться возврат на вторую команду. При ее выполнении в аккумулятор будет попадать число D5=213. Столько раз в цикле каждый раз будет выполняться предпоследняя команда. Один машинный цикл равен 1 мкс. В итоге получаем

        Ответ: 1+2*256+(2*249+2*255*213)+2*256=110153 мкс

        2. Оценить время выполнения команд после сброса МК51и содержимое аккумулятора при частоте кварца 12 МГц
  ORG 0  
0,1 MOV A,#7  
2,3,4 MOV B,#5  ;2
5 MOVC A,@A+PC ;   (A)=F8=248
6,7,8 DJNZ ACC,$  
9,10 PUSH ACC  ;2
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

        3. Оценить время выполнения команд после сброса при час-тоте кварца 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 ;4 ;253/2 (А)=126 (В)=1
  MUL AB ;4 ;(А)=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 мкс

        4. Оценить содержимое аккумулятора и время выполнения команд после сброса МК51 при частоте кварца 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