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

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

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

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

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

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

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

 
Опции темы

Объясните директиву .word

Непрочитано 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
Сообщений: 353
Сказал спасибо: 20
Сказали Спасибо 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.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
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.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
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.RUN
 
Регистрация: 13.12.2004
Сообщений: 3,168
Сказал спасибо: 11
Сказали Спасибо 691 раз(а) в 503 сообщении(ях)
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
А ну ка физики объясните мне simer1 Отвлекитесь, эмбеддеры! 15 17.11.2009 19:11


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.