|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Jun 2 2011, 18:03
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(Shadovv13 @ Jun 2 2011, 21:45)  Есть команда ICALL она делает вызов подпрограммы по адресу указаному регистром Z (r31:r30)
Допустим есть код с несколькими подпрограммами с метками, например sb1, sb2, sb3, и команда вызова ICALL Подскажите как получить адрес метки(ок), что бы задать их в регистр Z. Если побайтово - то ldi ZH,high(адрес) ldi ZL,low(адрес). Или, если это таблица - описать метки как .dw адрес1,адрес2... и загружать из таблицы.
|
|
|
|
|
Jun 2 2011, 18:14
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
rx3apf Вы не так поняли! Код Label1: nop ret
Label2: nop ret Как получить адрес метки Label1?
|
|
|
|
|
Jun 2 2011, 18:42
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Спасибо большое щас опробуем!!
|
|
|
|
|
Jun 3 2011, 05:43
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
А не так ли надо корректно? : Код ldi ZH, high(Label1 >>1 ) ldi ZL, low (Label1 >>1 ) Насколько я помню, у AVR-ров словарная адрессация памяти программ.
Сообщение отредактировал alexeyv - Jun 3 2011, 05:46
|
|
|
|
|
Jun 3 2011, 06:14
|

Познающий...
     
Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125

|
QUOTE (alexeyv @ Jun 3 2011, 14:43)  А не так ли надо корректно? : CODE ldi ZH, high(Label1 >>1 ) ldi ZL, low (Label1 >>1 ) Насколько я помню, у AVR-ров словарная адрессация памяти программ. Похоже, что так. Только я умножал на 2, а не делил. Т.е. мне нужно было прыгнуть на 0x1c00. В ассемблере написал 0x3800.
--------------------
Выбор.
|
|
|
|
|
Jun 3 2011, 07:39
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(alexeyv @ Jun 3 2011, 09:43)  А не так ли надо корректно? : Код ldi ZH, high(Label1 >>1 ) ldi ZL, low (Label1 >>1 ) Нет. Никаких умножений и делений в данном случае не нужно. Цитата Насколько я помню, у AVR-ров словарная адрессация памяти программ. Да. Поэтому для байтового доступа по команде LPM адрес надо умножать на 2. Но это другой случай.
|
|
|
|
|
Jun 3 2011, 15:27
|
Местный
  
Группа: Участник
Сообщений: 235
Регистрация: 20-11-10
Пользователь №: 61 032

|
Код ldi ZH, high(JT * 2) ; *2 !!! ldi ZL, low(JT * 2) lds Temp1, State lsl Temp1 ; *2 !!! add ZL, Temp1 brcc pc + 2 inc ZH
cli lpm Temp1, Z+ ; попробуй такой "+" без запрета прерываний lpm Temp2, Z sei
mov ZH, Temp1 mov ZL, Temp2
icall
JT: .db high(State_0), low(State_0) ; через .dw, кажись, hi/low были бы в обратном порядке... .db high(State_1), low(State_1) ; ... а так печатать дольше, зато наглядно и не думать ... Для наглядности как-то так.
|
|
|
|
|
Jun 19 2011, 15:15
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Всем привет!!! Нуждаюсь вашей помощи! Вот пример кода. Код ldi r19,0x90 out spl,r19
ldi ZH,high(b) ldi ZL,low(b) s: icall b:brtc en rjmp s
en:sbr r18,252 set ldi ZH,high(e00) ldi ZL,low(e00) cpi r18,252 breq s ldi ZH,high(e01) ldi ZL,low(e01) cpi r18,253 breq s ldi ZH,high(e11) ldi ZL,low(e11) cpi r18,255 breq s ldi ZH,high(e10) ldi ZL,low(e10) cpi r18,254 breq s
e00:clt sbrc r18,0 inc r10 sbrc r18,1 dec r10 ret
e01:clt sbrc r18,0 inc r10 sbrs r18,1 dec r10 ret
e11:clt sbrs r18,0 inc r10 sbrs r18,1 dec r10 ret
e10:clt sbrs r18,0 inc r10 sbrc r18,1 dec r10 ret При первом ret видает уведомление AVR Simulator: Stack Underflow at 0x001eПодскажите, может надо указать сегмент кода и озу???
|
|
|
|
|
Jun 19 2011, 16:22
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Цитата(Палыч @ Jun 19 2011, 19:12)  Ответ Вы найдёте сразу, если ответите на вопросы: 1) сколько раз выполнится команда ICALL до выполнения RET? 2) как и почему МК попал на команду RET? 1) Два раза. 2) Вишел из подпрограмы. По идее, в стеке до RET, сохранено два возврата, один с метки b,второй с метки e00Так о чем сообщает симулятор!? о повторном вызове ICALL ??
|
|
|
|
|
Jun 19 2011, 16:36
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Shadovv13 @ Jun 19 2011, 20:22)  1) Два раза. 2) Вишел из подпрограмы. Этот код Код s: icall b:brtc en rjmp s выполнялся бы бесконечно, если бы стек не "наехал" на область регистров. Цитата(Shadovv13 @ Jun 19 2011, 20:22)  Так о чем сообщает симулятор!? о повторном вызове ICALL ?? Подумайте: может ли стек распологаться по указанному адресу?
|
|
|
|
|
Jun 19 2011, 17:31
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 2-06-11
Пользователь №: 65 445

|
Цитата(Палыч @ Jun 19 2011, 19:36)  Этот код Код s: icall b:brtc en rjmp s выполнялся бы бесконечно, если бы стек не "наехал" на область регистров. Подумайте: может ли стек распологаться по указанному адресу? Частично изменил код... Код s: brtc en b:icall rjmp s Уведомление осталось.... AVR Simulator: Stack Underflow at 0x001еКакой адрес указать для стека в ATmega8?
Сообщение отредактировал Shadovv13 - Jun 19 2011, 17:34
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|