Определение того, сколько тактов потребуется для выполнения кода на языке ассемблера AVR. - PullRequest
0 голосов
/ 02 июля 2019

Если бы мне дали код сборки, подобный приведенному ниже, как я могу определить, сколько тактов потребуется для выполнения?

      ldi r20, 250
loop: inc r20
      brne loop
      nop

В таблице все инструкции занимают 16 бит (1 инструкцияслово).

Пытаясь сам, я получаю 14 в качестве ответа.Поскольку ldi r20, 250 вызывается один раз (1 цикл), то цикл вызывается 6 раз, прежде чем произойдет переполнение до нуля (6x2 = 12 циклов).И, наконец, в конце nop занимает 1 цикл.В общей сложности это 14 циклов.

Однако ответ, по-видимому, составляет 19 циклов.Кто-нибудь сможет сказать мне, что я сделал неправильно?

1 Ответ

3 голосов
/ 02 июля 2019

Вы пропустили, включая inc в каждом цикле.Таким образом, каждый цикл будет brne (2) + inc (1).Поэтому ваш расчет должен быть (r20 значение в скобках):

1
1 (251)
2
1 (252)
2
1 (253)
2
1 (254)
2
1 (255)
2
1 (0)
1
1

brne - 1 цикл, когда ветвь не берется.

Это немного более заметно, если вы разверните этот цикл:

; (4 cycles)
ldi r20, 250 ; 1
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (3 cycles)
inc r20      ; 1
nop          ; these two represent the brne at 2 cycles because it branches
nop

; (2 cycles)
inc r20      ; 1
nop          ; this represents the brne at 1 cycle, because its just overflowed and therefore ** will not branch **

; (1 cycle)
nop
...