AVR GCC assembler AS....

Do you have a question? Post it now! No Registration Necessary

Threaded View
      Рад приветствовать!

 Как мне в сабже получить смещение адреса таблицы
из секции .data или .text ? Таблица объявлена как метка.

С уважением, P.S.


AVR GCC assembler AS....
Привет serge!

26 Nov 04 11:12, serge polish писал All:

 sp>  Как мне в сабже

    Так в gcc или в gas?

 sp>  получить смещение адреса таблицы
 sp> из секции .data или .text ? Таблица объявлена как метка.

    Смещение относительно чего? Я ничего не понял. Ты бы хоть пример привел...

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Крыскас. Потому что крыса вам доверяет.

AVR GNU assembler AS....
 Привет Алексей!
 AM>     Так в gcc или в gas?
 Да......, прошу прощения......, не GCC, а GNU...., но ассемблер AS....
(avr-as.exe)

 sp>>  получить смещение адреса таблицы
 sp>> из секции .data или .text ? Таблица объявлена как метка.

 AM>     Смещение относительно чего? Я ничего не понял. Ты бы хоть пример
 AM> привел...
 ОК.....
 Попытка получить начальный адрес таблицы в области SRAM (или Flash):

;---------- объявляем таблицу в области данных
.data
Table:
.byte    1, 2, 3, 4, 0

;---------- область кода
.text
  ldi    r28, Table

   Все было бы хорошо, если быть уверенным, что таблица начинается и лежит в
диапазоне адресов до 0xFF. Собственно проблема и состоит в том, как загрузить
старшую часть адреса.

Попытка:
  ldi    r28, Table & 255              ;low
  ldi    r29, Table >> 8                ;high
приводит к ошибке "Error: invalid sections for operation on `Table' and `L0'"

Директивы ассемблера "AVR Studio"
  ldi    r28, low(Table)
  ldi    r29, high(Table)
не катят....... Выдается ошибка "Error: garbage at end of line"........

С уважением, P.S.


AVR GNU assembler AS....
Привет serge!

26 Nov 04 13:41, serge polish писал Alex Mogilnikov:

 AM>>     Смещение относительно чего? Я ничего не понял. Ты бы хоть
 AM>> пример привел...
 sp>  ОК.....
 sp>  Попытка получить начальный адрес таблицы в области SRAM (или Flash):

 sp> ;---------- объявляем таблицу в области данных
 sp> .data
 sp> Table:
 sp> .byte   1, 2, 3, 4, 0

    Абсолютный адрес начала таблицы? Тогда это Table - после размещения секции
.data линкер вычислить адрес Table и соответственно настроит код в местах его
использования.

 sp>    Все было бы хорошо, если быть уверенным, что таблица начинается и
 sp> лежит в диапазоне адресов до 0xFF. Собственно проблема и состоит в
 sp> том, как загрузить старшую часть адреса.

 sp> Попытка:
 sp>   ldi   r28, Table & 255              ;low
 sp>   ldi   r29, Table >> 8                ;high
 sp> приводит к ошибке "Error: invalid sections for operation on `Table'
 sp> and `L0@'"

    ldi r28, lo8(Table)
    ldi r29, hi8(Table)

 sp> Директивы ассемблера "AVR Studio"
 sp>   ldi   r28, low(Table)
 sp>   ldi   r29, high(Table)
 sp> не катят....... Выдается ошибка "Error: garbage at end of
 sp> line"........

    Логично. При чем тут AVR Studio?

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Hе место портит человека, а человек место.

AVR GNU assembler AS....
    Привет Алексей!

 AM>     ldi r28, lo8(Table)
 AM>     ldi r29, hi8(Table)

 lo8, hi8 !  вот что мне было нужно!
 Безмерно благодарен, Алексей!

С уважением, P.S.


AVR GNU assembler AS....
Hello serge polish!

 AM>>     ldi r28, lo8(Table)
 AM>>     ldi r29, hi8(Table)

 sp>  lo8, hi8 !  вот что мне было нужно!
 sp>  Безмерно благодарен, Алексей!

Почему-то сpазу вспомнился анекдот : "... ну, сейчас мои пацаны вам
покажут - кто тут из нас LoHi !.." Ж&}


Re: AVR GNU assembler AS....
         Привет, Алексей!

 AM>     Hе знаю. Hо в подобных случаях полезно посмотреть, какой код генерит
 AM> для аналогичного случая компилятор.

   Да....... полезно для оптимизации и проверки правильности кода......... Hо,
как правило,
в листинге уже все "расставлено" по местам.......
А вот когда в полном объеме неизвестен синтаксис, директивы, операторы......
что может
получиться хорошего......?...... кроме "извращения" над кодом....... Или
вообще и кода
не получиться :)

  Вот опять столкнулся с очередной заморочкой.
Все та же таблица

#define  var1  5
#define  var2  68
#define  var3  8

TABLE:
.byte  var1, var2, var3, 0

Как обьяснить AS'у, что мне нужно загрузить не значение var2, а его
адрес в таблице??? Вот и занимаюсь целый день тем, что блуждаю по
документации......
или что:
VAR_1:
  .byte  var1
VAR_2:
  .byte  var2
VAR_3:
  .byte  var3, 0........ ??? стыдно кому нить показывать.........

С уважением, P.S.


AVR GNU assembler AS....
Привет serge!

29 Nov 04 21:10, serge polish писал Alex Mogilnikov:

 sp>  А вот когда в полном объеме неизвестен синтаксис,
 sp> директивы, операторы...... что может получиться хорошего......?

    Hу уж, ты преувеличиваешь. AFAIK никаких специфичных именно для avr target
директив в gas нет, и синтаксис ничем не отличается от большинства других
таргетов. Вот специфичные операторы к сожалению есть, но ИМХО ты их уже почти
все знаешь - кроме hi8 и lo8 я знаю еще pm.

 sp>   Вот опять столкнулся с очередной заморочкой.
 sp> Все та же таблица

 sp> #define  var1  5
 sp> #define  var2  68
 sp> #define  var3  8

 sp> TABLE:
 sp> .byte  var1, var2, var3, 0

 sp> Как обьяснить AS'у, что мне нужно загрузить не значение var2, а его
 sp> адрес в таблице???

    .data
TABLE:
    .byte   var1, var2, var3, 0

    .text
    ldi     r28, lo8(TABLE+1)
    ldi     r29, hi8(TABLE+1)

 sp>  Вот и занимаюсь целый день тем, что блуждаю по
 sp> документации......

    Зачем? :) Все, что нужно, ты уже знаешь.

 sp> или что:
 sp> VAR_1:
 sp>   .byte  var1
 sp> VAR_2:
 sp>   .byte  var2
 sp> VAR_3:
 sp>   .byte  var3, 0........ ??? стыдно кому нить показывать.........

    Почему?

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Если ты коп, почему я весь взмок?

AVR GNU assembler AS....
Mon Nov 29 2004 23:11, Alex Mogilnikov wrote to serge polish:

     Привет Алексей!

 AM>     Hу уж, ты преувеличиваешь. AFAIK никаких специфичных именно для avr
 AM> target директив в gas нет, и синтаксис ничем не отличается от большинства
 AM> других таргетов. Вот специфичные операторы к сожалению есть, но ИМХО ты
 AM> их уже почти все знаешь - кроме hi8 и lo8 я знаю еще pm.

       Тяжело сказать что то по этому поводу..... Компилятор для меня
новый.......
Hо то, что появились существенные ограничения, по сравнению с компиляторами
для других машин (имею ввиду tasm и x8051) - это факт......

    .data
TABLE:
    .byte   var1, var2, var3, 0

    .text
    ldi     r28, lo8(TABLE+1)
    ldi     r29, hi8(TABLE+1)

   Ооо.....! В этом случае нужно еще следить и за порядком данных в
таблице.....
дополнительный геморрой......

 sp>>   .byte  var2
 sp>> VAR_3:
 sp>>   .byte  var3, 0........ ??? стыдно кому нить показывать.........

 AM>     Почему?
 Да стройности нету...... однако, если нет другого решения - придется
показывать.... :)

 А что делает оператор pm? В хелпе я вообще не нашел на него ссылок.......

С уважением, P.S.


AVR GNU assembler AS....
Привет serge!

30 Nov 04 11:53, serge polish писал Alex Mogilnikov:

 sp>     .data
 sp> TABLE:
 sp>     .byte   var1, var2, var3, 0

 sp>     .text
 sp>     ldi     r28, lo8(TABLE+1)
 sp>     ldi     r29, hi8(TABLE+1)

 sp>    Ооо.....! В этом случае нужно еще следить и за порядком данных в
 sp> таблице..... дополнительный геморрой......

    Как я понял, по условию задачи было "загрузить адрес 1-го (считая от нуля)
элемента таблицы". Раз элементы нумерованы, значит порядок важен. По условию.

    Если же порядок не важен, то это уже не доступ к элементу таблицы, это
доступ к "отдельно стоящему" объекту. А значит определяй указывающую на него
метку. По-моему это очевидно.

 sp>>>   .byte  var2
 sp>>> VAR_3:
 sp>>>   .byte  var3, 0........ ??? стыдно кому нить
 sp>>> показывать.........

 AM>>     Почему?
 sp>  Да стройности нету...... однако, если нет другого решения - придется
 sp> показывать.... :)

    Стройность состоит в том, что определяется значение объекта (var3) и
символ, указывающий на этот объект (VAR_3). Если тебе не нравится сама форма
записи, можешь определить макрос, например такой:

#define DEF_VAR(name, value) \
name:   .byte   value

 sp>  А что делает оператор pm? В хелпе я вообще не нашел на него
 sp> ссылок.......

    Он преобразует байтовый адрес в пограммной памяти в адрес инструкции
(двухбайтового слова), то есть, проще говоря, делит его на 2. Вот пример
случая, когда это нужно:

fff:
    какой-то код
    ret

    .....

    ldi r24,lo8(pm(fff))    ; записываем адрес функции fff в fp
    ldi r25,hi8(pm(fff))
    sts (fp)+1,r25
    sts fp,r24

    .....

    lds r30,fp              ; вызываем функцию по адресу в fp
    lds r31,(fp)+1
    icall

Всего наилучшего,                                 [Team PCAD 2000]
Алексей М.
... Слепой Пью, Глухой Ем...

AVR GNU assembler AS....
              Привет Алексей!

  Как получилось, что директивы "lo8", "hi8" не задокументированы в разделе
"Using As"?
По поиску нашел их использование только в одном из примеров раздела "FAQ".
Получается, что это давний Unix'овый стандарт, поддерживаемый компилятором, и
принимаемый как бы по дефолту. И можно предположить, что в этом дефолте есть
еще
много чего интересного для программирования в Unix-системах.
Где можно подробней почитать о том, что касается программирования на
ассемблере
в Unix'е ?

С уважением, P.S.


Re: AVR GNU assembler AS....
Hемедленно нажми на RESET, serge polish!


 sp>   ldi    r29, Table >> 8                ;high
 sp> приводит к ошибке "Error: invalid sections for operation on `Table' and
 sp> `L0'"

  Table / 256 ?


--
  KenoTron /eTc gRoUp/scEne, 999 - AuTumn'99

Site Timeline