1

Тема: Як працює команда ldi ?

Хай. Поясніть бдлска, оцей шматок коду

 loop:
 ;19
 ldi r16, (1<<1)
 out PORTE, r16
 ldi r16, (1<<1)
 out PORTD, r16
 rcall delay
 rcall clear 
 rcall delay

ну от, шо я думаю, loop то цикл, значить це треба повторити 19 разів, ага?
ldi r16 заносить (1<<1) в 16-тий регістр, ага? Але я хз, що це за (1<<1)
Потім ми виводимо значення з регістра r16 на порт PORTD.
Далі ми викликаємо функцію чекання, потім очищання, і потім знову чекання.

2

Re: Як працює команда ldi ?

Ви самі майже все пояснили.
1. 1<<1 це 0b00000010;
2. оскільки писати зразу на порти вводу.виводу не можна то r16 виступає як тимчасовий буфер;
3. Внаслідок робити 3-6 рядків на портах D i E вивід 1 (якщо нумерувати з 0) переводиться в лог 1;
4. І головне переходу на мітку loop ніде нема в даному куску тож воно виконується лише раз;
5. А ";19" - це лише коментар, хоча це ще залежить він програми ассемблера

Подякували: FakiNyan1

3

Re: Як працює команда ldi ?

FakiNyan написав:

ну от, шо я думаю, loop то цикл, значить це треба повторити 19 разів, ага?

loop - це мітка, на яку десь відбувається перехід; можна припустити, що задля організації циклу, але тільки припустити.
;19 - це коментар.

Подякували: FakiNyan1

4

Re: Як працює команда ldi ?

drWoZD написав:

Ви самі майже все пояснили.
1. 1<<1 це 0b00000010;
2. оскільки писати зразу на порти вводу.виводу не можна то r16 виступає як тимчасовий буфер;
3. Внаслідок робити 3-6 рядків на портах D i E вивід 1 (якщо нумерувати з 0) переводиться в лог 1;
4. І головне переходу на мітку loop ніде нема в даному куску тож воно виконується лише раз;
5. А ";19" - це лише коментар, хоча це ще залежить він програми ассемблера

А чому 1<<1 це 0b00000010? І поясніть, шо то за лог 1? І ще знаєте що? Тітка-викладач запитувала щось таке - "r16 це типу 16-бітовий регістр, а значення, котре ми заносимо в нього - восьмибітове, і як воно туди заноситься?"

5

Re: Як працює команда ldi ?

FakiNyan написав:
drWoZD написав:

Ви самі майже все пояснили.
1. 1<<1 це 0b00000010;
2. оскільки писати зразу на порти вводу.виводу не можна то r16 виступає як тимчасовий буфер;
3. Внаслідок робити 3-6 рядків на портах D i E вивід 1 (якщо нумерувати з 0) переводиться в лог 1;
4. І головне переходу на мітку loop ніде нема в даному куску тож воно виконується лише раз;
5. А ";19" - це лише коментар, хоча це ще залежить він програми ассемблера

А чому 1<<1 це 0b00000010? І поясніть, шо то за лог 1? І ще знаєте що? Тітка-викладач запитувала щось таке - "r16 це типу 16-бітовий регістр, а значення, котре ми заносимо в нього - восьмибітове, і як воно туди заноситься?"

щодо 1<<1 - це операція зміщення тобто число 1 зміщується на 1 біт в право.
лог 1 - це логічна одиниця, тобто для МК це означає що на відповідному виводі 3,3(частіше) - 5 В (залежить від напруги живлення типу і тд).
Розрядність регістрів залежить від типу МК. Число 16 це тільки номер. Але якщо регістр все ж 16-бітний то при занесені 8 -бітного числа старші біти обнуляються.

Подякували: FakiNyan1

6

Re: Як працює команда ldi ?

drWoZD написав:
FakiNyan написав:
drWoZD написав:

Ви самі майже все пояснили.
1. 1<<1 це 0b00000010;
2. оскільки писати зразу на порти вводу.виводу не можна то r16 виступає як тимчасовий буфер;
3. Внаслідок робити 3-6 рядків на портах D i E вивід 1 (якщо нумерувати з 0) переводиться в лог 1;
4. І головне переходу на мітку loop ніде нема в даному куску тож воно виконується лише раз;
5. А ";19" - це лише коментар, хоча це ще залежить він програми ассемблера

А чому 1<<1 це 0b00000010? І поясніть, шо то за лог 1? І ще знаєте що? Тітка-викладач запитувала щось таке - "r16 це типу 16-бітовий регістр, а значення, котре ми заносимо в нього - восьмибітове, і як воно туди заноситься?"

щодо 1<<1 - це операція зміщення тобто число 1 зміщується на 1 біт в право.
лог 1 - це логічна одиниця, тобто для МК це означає що на відповідному виводі 3,3(частіше) - 5 В (залежить від напруги живлення типу і тд).
Розрядність регістрів залежить від типу МК. Число 16 це тільки номер. Але якщо регістр все ж 16-бітний то при занесені 8 -бітного числа старші біти обнуляються.

так от. 1, це у нас, ааа, блііін, от я туплю, побачив там 0b на початку, і затупив, але ж це просто позначення, що наступні числа у бінарній системі хД дякую. Але чому б не заносити в ті порти просто 1, чому саме 1<<1 ? Типу так домовились робити, чи треба тільки так, і ніяк по іншому?

7

Re: Як працює команда ldi ?

Слухайте. поясніть тепер за підпроцедуру delay. Ось вона

delay:
 ldi r16, 30

Я очікував тут побачити щось типу NOP, але те, що я побачив, шокувало мене... Очевидно, що в r16 заноситься 30, але навіщо???? Що воно робить?

8

Re: Як працює команда ldi ?

Можу припустити, що після цього там є ще якісь команди...

9

Re: Як працює команда ldi ?

Мені здається що ви кинули не всю функуію delay. Десь має бути інструкуія ret чи щось таке

Подякували: koala, FakiNyan2

10

Re: Як працює команда ldi ?

koala написав:

Можу припустити, що після цього там є ще якісь команди...

delay:
 ldi r16, 30
 delay1:
 ldi r17, 200
 delay2:
 ldi r18, 200
 delay3:
 dec r18
 brne delay3
 dec r17
 brne delay2
 dec r16
 brne delay1
 ret
 clear:
 ldi r16, 0x00
 out PORTE, r16
 out PORTD, r16
 ret

11

Re: Як працює команда ldi ?

Функція тут:

delay:
ldi r16, 30
delay1:
ldi r17, 200
delay2:
ldi r18, 200
delay3:
dec r18
brne delay3
dec r17
brne delay2
dec r16
brne delay1
ret

і являє собою купу циклів (200*200*30), які нічого не роблять, тільки обчислюють кількість циклів.

Про всяк випадок пояснюю, що:
- jmp змінює адресу поточної команди на свій аргумент (і т.ч. переходить на ту адресу),
- rcall записує адресу наступної команди в стек і виконує jmp на свій аргумент,
- ret витягає адресу зі стеку і виконує jmp на неї. Ферштейн?

Подякували: FakiNyan1

12

Re: Як працює команда ldi ?

Ну тут затримка виконуєтьмя за рахунок перезапису регістрів. Фактично затримка становитт трохи більше ніж 1200000 тактів. Цикл delay1 виконує delay2 30 раз, а delay2 виконує delay3 200 раз. delay3 200раз декрементує r18

13

Re: Як працює команда ldi ?

Насправді більш ніж утричі довше, якщо вірити http://www.gaw.ru/html.cgi/txt/doc/micr … /start.htm
Кожен dec - 1 цикл, більшість переходів - по 2 цикли.

14

Re: Як працює команда ldi ?

а шо отой brne робе?

15

Re: Як працює команда ldi ?

brne пернвіряє біт Z в SREG,і якщо він 0 то виконує перехід. Якщо простіше то виконує перехід якщо результат попередньої операції не 0.

Подякували: FakiNyan1

16

Re: Як працює команда ldi ?

Навпаке - ne, not equal. Перехід, коли не 0. І взагалі я посилання кидав, ви читали?

Подякували: FakiNyan1

17

Re: Як працює команда ldi ?

koala написав:

Навпаке - ne, not equal. Перехід, коли не 0. І взагалі я посилання кидав, ви читали?

ну я читав опис команди, але не по вашому посиланню, але все одно не зрозумів, там же написано - 'перейти если не равно', а шо не равно, кому не равно - хз, ну тепер все зрозуміло

18

Re: Як працює команда ldi ?

Порівняння в асемблерах зазвичай здійснюються так: є команда "порівняти" (CP, CMP), яка працює так само, як і віднімання, тільки не зберігає ніде результат (як варіант - саме віднімання і використовується). При будь-якій операції виставляються прапорці (нуль, від'ємний, додатний, переповнення і т.д.), і є команди умовного переходу, які виконуються, якщо прапорець виставлено.