Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 01.04.2010, 03:22  
toxxinus
Временная регистрация
 
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
toxxinus на пути к лучшему
По умолчанию Объясните директиву .word

Здравствуйте!
Не могу понять директиву .word. В мануалах написано, что сохраняет значение в объектный файл. Конкретнее ничего не нашел.

Или поделитесь ссылкой, где подробно написано.

Заранее спасибо!

Вот примеры использования:

Код:
.word TEXT_TEST

.word 0x23431223
P.S. Архитектура ARM.
Реклама:
toxxinus вне форума  
Непрочитано 01.04.2010, 15:41  
OneTech
Вид на жительство
 
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
OneTech на пути к лучшему
Восклицание Re: Объясните директиву .word

Мне кажется, что эта деректива резервирует в памяти 32 битное число, например если вы делаете какую-нибудь табличку, аналогично резервированию одиночных байтов в памяти программ (flash), например AVR:
sine_table:
.DB 0x03,0x06,0x09,0x0C,0x0F,0x12,0x15,0x18,0x1B,0x1D
.DB 0x20,0x23,0x26,0x29,0x2C,0x2E,0x31,0x34,0x37,0x3A
.DB 0x3C,0x3F,0x42,0x45,0x47,0x4A,0x4D,0x4F,0x52,0x54. ..

Резервируем слова (16-ти битные числа):
sine_table:
.DW 0x0306,0x090C,0x0F12,0x1518,0x1B1D
.DW 0x2023,0x2629,0x2C2E,0x3134,0x373A
.DW 0x3C3F,0x4245,0x474A,0x4D4F,0x5254...

Еще раз напомню, что это пример для 8-ми разрядныз МК у которых память состоит из 16-ти битных слов. А так как в Вашем случае МК 32-х разрядный, то память состоит из 32-х слов, что в данном случае на англицкий переводится как word, следовательно в памяти вы можете резервировать память программ таким образом:

sine_table:
.word 0x0306090C,0x0F121518
.word 0x20232629,0x2C2E3134
.word 0x3C3F4245,0x474A4D4F

.PS причём тут объектный файл я не понял, полагаю что исходный код разбивается на отдельные файлы, и собственно таблицы с числами вроде sine_table сохраняются в отдельные объектные файлы файлы.

Пардон, если многа букафф.

Последний раз редактировалось OneTech; 01.04.2010 в 15:45.
OneTech вне форума  
Сказали "Спасибо" OneTech
toxxinus (01.04.2010)
Непрочитано 01.04.2010, 16:56  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Объясните директиву .word

Сообщение от toxxinus Посмотреть сообщение
Не могу понять директиву .word. В мануалах написано, что сохраняет значение в объектный файл. Конкретнее ничего не нашел.
Ну так это и так конкретнее некуда. Вообще директивы зависят от ассемблера. Все что дальше - GNU ASM

Код:
.section .text , "ax"
// секция .text - куда складывается исполняемые инструкции, т.е. сама программа
// называться может и по другому, это определяется скриптом линкера
// можно константу и еще куда поместить - в .rodata например, если такая секция определена в скрипте

ldr R0, =LabelConst
// В R0 адрес нашей константы
ldr R1,[R0]
// Загрузили в R1 0x12345678
// что нибудь с этим делаем :)

LabelConst:
.word 0x12345678
Читайте документацию на свой ассемблер, так как действие директив может отличаться.
Кстати - посмотрите свой стартап, там обычно много таких директив, через них адреса обработчиков исключительных ситуаций определяются.
kison вне форума  
Сказали "Спасибо" kison
toxxinus (01.04.2010)
Непрочитано 02.04.2010, 00:47  
lazil
Прохожий
 
Регистрация: 27.11.2009
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
lazil на пути к лучшему
По умолчанию Re: Объясните директиву .word

Директива указывает, что ее аргумент будет сохранен как есть в оттранслированном файле.
.word 1234 -
1234 будет записано в следующее 16-битное слово.

.word TEXT -
адрес метки текст будет сохранен в 16-битное слово.

Также есть .byte, .dword итп, в зависимости от асма.
lazil вне форума  
Сказали "Спасибо" lazil
toxxinus (02.04.2010)
Непрочитано 02.04.2010, 19:01  
toxxinus
Временная регистрация
 
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
toxxinus на пути к лучшему
По умолчанию Re: Объясните директиву .word

Сообщение от lazil Посмотреть сообщение
Директива указывает, что ее аргумент будет сохранен как есть в оттранслированном файле.
Смысл все равно не очень понятен. Ну вот сохранили мы число "как есть", а как с ним работать в программе?? и что нам дает такое сохранение??

Вот идет, предположим, 5 строк программы, далее вставляется данная директива .word 0x12345678, и еще 5 строк программы. при компиляции каждая строка(в ассемблере) преобразуется в машинную инструкцию. Таким образом получаем 5 строк инструкции(32 битных), далее компилятор запишет число 0x12345678, и далее пойдут еще 5 "слов" инструкций. Правильно я понял?? Если да, то какой зачем это делается??
toxxinus вне форума  
Непрочитано 02.04.2010, 19:38  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Объясните директиву .word

Сообщение от toxxinus Посмотреть сообщение
Смысл все равно не очень понятен. Ну вот сохранили мы число "как есть", а как с ним работать в программе?? и что нам дает такое сохранение??
Дает возможность загрузить произвольное значение в произвольный регистр.
Сообщение от toxxinus Посмотреть сообщение
Если да, то какой зачем это делается??
Ну например именно так - посреди инструкций записывается значение неиспользуемого вектора прерываний. По которому загрузчик определяет - есть внутри программа или нет.
Код:
_vectors:
  ldr pc, [pc, #reset_handler_address - . - 8]  /* reset */
  ldr pc, [pc, #undef_handler_address - . - 8]  /* undefined instruction */
  ldr pc, [pc, #swi_handler_address - . - 8]    /* swi handler */
  ldr pc, [pc, #pabort_handler_address - . - 8] /* abort prefetch */
  ldr pc, [pc, #dabort_handler_address - . - 8] /* abort data */
#ifdef VECTORED_IRQ_INTERRUPTS
  .word 0xB9205F88                              /* boot loader checksum */
  ldr pc, [pc, #-0xFF0]                         /* irq handler */
#else
  .word 0xB8A06F60                              /* boot loader checksum */
  ldr pc, [pc, #irq_handler_address - . - 8]    /* irq handler */
#endif
  ldr pc, [pc, #fiq_handler_address - . - 8]    /* fiq handle
Для обоих вариантов - со своей оберткой и для векторизованных прерываний "волшебная" константа уже подсчитана. Остается только разместить ее прямо посреди исполняемого кода.
kison вне форума  
Сказали "Спасибо" kison
toxxinus (03.04.2010)
Непрочитано 03.04.2010, 13:53  
toxxinus
Временная регистрация
 
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
toxxinus на пути к лучшему
По умолчанию Re: Объясните директиву .word

И все же один вопрос остается не очень ясным. Вот у нас 5 инструкций записанных в памяти, дальше идет записанное с помощью директивы .word число 0x12345678, а дальше еще 5 инструкций. Механизм выборки и декодирования инструкций выбирает первые пять, а потом выбирает число 0x12345678 и пытается опознать в этом числе инструкцию, что понятное дело у него не получается. И вот что в этот момент происходит не ясно...
toxxinus вне форума  
Непрочитано 03.04.2010, 14:08  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Объясните директиву .word

Сообщение от toxxinus Посмотреть сообщение
а потом выбирает число 0x12345678 и пытается опознать в этом числе инструкцию, что понятное дело у него не получается. И вот что в этот момент происходит не ясно...
Ничего не происходит. Если дойдет до выполнения, то будет два варианта - если константу можно трактовать как инструкцию, то она выполнится с непредсказуемым для программы результатом. Если нельзя - летим в исключение. В приведенном мной примере из стартапа инструкции перед константой модифицируют PC, так что до выполнения константы дело просто не дойдет.
А чем вызван такой интерес?
kison вне форума  
Сказали "Спасибо" kison
toxxinus (03.04.2010)
Непрочитано 03.04.2010, 14:28  
toxxinus
Временная регистрация
 
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
toxxinus на пути к лучшему
По умолчанию Re: Объясните директиву .word

Сообщение от kison Посмотреть сообщение
А чем вызван такой интерес?
Изучением архитектуры ARM. А если конкретнее, то собираем девайс на контроллере OMAP3530 с процессором Cortex-A8. Там есть первичный загрузчик от Texas Instruments, вот его пытаюсь досканально изучить с параллельным изучением архитектуры. Торможу на простейший строчках кода)).

А тут еще более менее сложные инструкции заставляют задумываться))
toxxinus вне форума  
Непрочитано 06.04.2010, 16:03  
alpenov
Прохожий
 
Регистрация: 19.10.2008
Адрес: Санкт-Петербург, Россия
Сообщений: 6
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
alpenov на пути к лучшему
По умолчанию Re: Объясните директиву .word

OneTech,
Драгоценнейший "частый гость". Уж если пишете, то по крайней мере не делайте ошибок ни в грамматике, ни в смысле. В Вашем письме допущена весьма грубая ошибка:

---------------------------------------------------
Мне кажется, что эта деректива резервирует в памяти 32 битное число, например если вы делаете какую-нибудь табличку, аналогично резервированию одиночных байтов в памяти программ (flash), например AVR:
sine_table:
.DB 0x03,0x06,0x09,0x0C,0x0F,0x12,0x15,0x18,0x1B,0x1D
.DB 0x20,0x23,0x26,0x29,0x2C,0x2E,0x31,0x34,0x37,0x3A
.DB 0x3C,0x3F,0x42,0x45,0x47,0x4A,0x4D,0x4F,0x52,0x54. ..

Резервируем слова (16-ти битные числа):
sine_table:
.DW 0x0306,0x090C,0x0F12,0x1518,0x1B1D
.DW 0x2023,0x2629,0x2C2E,0x3134,0x373A
.DW 0x3C3F,0x4245,0x474A,0x4D4F,0x5254...

Еще раз напомню, что это пример для 8-ми разрядныз МК у которых память состоит из 16-ти битных слов. А так как в Вашем случае МК 32-х разрядный, то память состоит из 32-х слов, что в данном случае на англицкий переводится как word, следовательно в памяти вы можете резервировать память программ таким образом:

sine_table:
.word 0x0306090C,0x0F121518
.word 0x20232629,0x2C2E3134
.word 0x3C3F4245,0x474A4D4F
.....
---------------------------------
Большинство 32-битовых процессоров используют little-endian способ расположения многобайтовых элементов в памяти. В исходном Вашем тексте первая строка выглядит так:

.DB 0x03,0x06,0x09,0x0C,0x0F,0x12,0x15,0x18,0x1B,0x1D

Поскольку в случае little endian младшие байты многобайтовых элементов располагаются по младшим адресам, то верная директива будет такой:

.DW 0x0C090603, 0x1815120F, ..

а не так, как у Вас.

Остаюсь, с совершеннейшим почтением
alpenov вне форума  
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните как работает схема inisider Делимся опытом 3 27.03.2010 00:08
Объясните принцип действия К1109КТ23 xxparadoxx Электроника - это просто 1 28.12.2009 18:01
А ну ка физики объясните мне simer1 Отвлекитесь, эмбеддеры! 15 17.11.2009 19:11


Часовой пояс GMT +4, время: 06:15.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot