Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
01.04.2010, 03:22
|
|
Временная регистрация
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Объясните директиву .word
Здравствуйте!
Не могу понять директиву .word. В мануалах написано, что сохраняет значение в объектный файл. Конкретнее ничего не нашел.
Или поделитесь ссылкой, где подробно написано.
Заранее спасибо!
Вот примеры использования:
Код:
|
.word TEXT_TEST
.word 0x23431223 |
P.S. Архитектура ARM.
|
|
|
|
01.04.2010, 15:41
|
|
Вид на жительство
Регистрация: 09.10.2009
Сообщений: 356
Сказал спасибо: 21
Сказали Спасибо 64 раз(а) в 46 сообщении(ях)
|
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
|
|
|
01.04.2010, 16:56
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Объясните директиву .word
Сообщение от toxxinus
|
Не могу понять директиву .word. В мануалах написано, что сохраняет значение в объектный файл. Конкретнее ничего не нашел.
|
Ну так это и так конкретнее некуда. Вообще директивы зависят от ассемблера. Все что дальше - GNU ASM
Код:
|
.section .text , "ax"
// секция .text - куда складывается исполняемые инструкции, т.е. сама программа
// называться может и по другому, это определяется скриптом линкера
// можно константу и еще куда поместить - в .rodata например, если такая секция определена в скрипте
ldr R0, =LabelConst
// В R0 адрес нашей константы
ldr R1,[R0]
// Загрузили в R1 0x12345678
// что нибудь с этим делаем :)
LabelConst:
.word 0x12345678 |
Читайте документацию на свой ассемблер, так как действие директив может отличаться.
Кстати - посмотрите свой стартап, там обычно много таких директив, через них адреса обработчиков исключительных ситуаций определяются.
|
|
|
|
02.04.2010, 00:47
|
|
Прохожий
Регистрация: 27.11.2009
Сообщений: 2
Сказал спасибо: 0
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Объясните директиву .word
Директива указывает, что ее аргумент будет сохранен как есть в оттранслированном файле.
.word 1234 -
1234 будет записано в следующее 16-битное слово.
.word TEXT -
адрес метки текст будет сохранен в 16-битное слово.
Также есть .byte, .dword итп, в зависимости от асма.
|
|
|
|
02.04.2010, 19:01
|
|
Временная регистрация
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Объясните директиву .word
Сообщение от lazil
|
Директива указывает, что ее аргумент будет сохранен как есть в оттранслированном файле.
|
Смысл все равно не очень понятен. Ну вот сохранили мы число "как есть", а как с ним работать в программе?? и что нам дает такое сохранение??
Вот идет, предположим, 5 строк программы, далее вставляется данная директива .word 0x12345678, и еще 5 строк программы. при компиляции каждая строка(в ассемблере) преобразуется в машинную инструкцию. Таким образом получаем 5 строк инструкции(32 битных), далее компилятор запишет число 0x12345678, и далее пойдут еще 5 "слов" инструкций. Правильно я понял?? Если да, то какой зачем это делается??
|
|
|
|
02.04.2010, 19:38
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
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 |
Для обоих вариантов - со своей оберткой и для векторизованных прерываний "волшебная" константа уже подсчитана. Остается только разместить ее прямо посреди исполняемого кода.
|
|
|
|
03.04.2010, 13:53
|
|
Временная регистрация
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Объясните директиву .word
И все же один вопрос остается не очень ясным. Вот у нас 5 инструкций записанных в памяти, дальше идет записанное с помощью директивы .word число 0x12345678, а дальше еще 5 инструкций. Механизм выборки и декодирования инструкций выбирает первые пять, а потом выбирает число 0x12345678 и пытается опознать в этом числе инструкцию, что понятное дело у него не получается. И вот что в этот момент происходит не ясно...
|
|
|
|
03.04.2010, 14:08
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Объясните директиву .word
Сообщение от toxxinus
|
а потом выбирает число 0x12345678 и пытается опознать в этом числе инструкцию, что понятное дело у него не получается. И вот что в этот момент происходит не ясно...
|
Ничего не происходит. Если дойдет до выполнения, то будет два варианта - если константу можно трактовать как инструкцию, то она выполнится с непредсказуемым для программы результатом. Если нельзя - летим в исключение. В приведенном мной примере из стартапа инструкции перед константой модифицируют PC, так что до выполнения константы дело просто не дойдет.
А чем вызван такой интерес?
|
|
|
|
03.04.2010, 14:28
|
|
Временная регистрация
Регистрация: 12.02.2008
Сообщений: 77
Сказал спасибо: 84
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Объясните директиву .word
Сообщение от kison
|
А чем вызван такой интерес?
|
Изучением архитектуры ARM. А если конкретнее, то собираем девайс на контроллере OMAP3530 с процессором Cortex-A8. Там есть первичный загрузчик от Texas Instruments, вот его пытаюсь досканально изучить с параллельным изучением архитектуры. Торможу на простейший строчках кода)).
А тут еще более менее сложные инструкции заставляют задумываться))
|
|
|
|
06.04.2010, 16:03
|
|
Прохожий
Регистрация: 19.10.2008
Адрес: Санкт-Петербург, Россия
Сообщений: 6
Сказал спасибо: 1
Сказали Спасибо 2 раз(а) в 2 сообщении(ях)
|
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, ..
а не так, как у Вас.
Остаюсь, с совершеннейшим почтением
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 06:15.
|
|