Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Создание и работа с переменными в ассемблере
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
allsettingsdone
Не могу понять как создавать и работать с переменными разного размера в ассемблере в Keil. Директивы DB, DW, DD выдают ошибку(похоже на то, что Keil их вообще не знает), BYTE, WORD, DWORD - то же самое. Как я понял директивы GBLL, GBLS, GBLA создают (в RAM?) переменную и далее ей можно придать значение используя SETA, SETL, SETS, но при попытке повторно сохранить значение этой переменной получаем ошибку при компиляции, да и не понятно где именно в памяти Keil разместит переменную. Можно конечно сделать так Var0 EQU 0x(адрес переменной в памяти), но есть ли другие(более удобные) способы ? И как вообще принято это делать?
Палыч
Цитата(allsettingsdone @ Feb 3 2014, 11:11) *
Директивы DB, DW, DD выдают ошибку(похоже на то, что Keil их вообще не знает), BYTE, WORD, DWORD - то же самое.

DCB, DCW, DCWU, DCD, DCDU....
allsettingsdone
Цитата(Палыч @ Feb 3 2014, 09:27) *
DCB, DCW, DCWU, DCD, DCDU....


Вот допустим я делаю счетчик, пишу test0 DCWU 0xFFFF
Затем уменьшаю на 1 ( MOV32 R0, #test0
SUB R0, #1)
Её сохранять обратно в память таким образом? - STR R0, [#test0] ? Компилятор выделит память под 4 байта?
demiurg_spb
Цитата(allsettingsdone @ Feb 3 2014, 10:54) *

http://infocenter.arm.com/help/index.jsp?t...b/Bcfihdhj.html
Golikov A.
Цитата(allsettingsdone @ Feb 3 2014, 11:54) *
Вот допустим я делаю счетчик, пишу test0 DCWU 0xFFFF
Затем уменьшаю на 1 ( MOV32 R0, #test0
SUB R0, #1)
Её сохранять обратно в память таким образом? - STR R0, [#test0] ? Компилятор выделит память под 4 байта?


мне всегда помогало написать код на С, а потом поглядеть дизассемблер после компиляции.

KnightIgor
Цитата(allsettingsdone @ Feb 3 2014, 08:54) *
Вот допустим я делаю счетчик, пишу test0 DCWU 0xFFFF
Затем уменьшаю на 1 ( MOV32 R0, #test0
SUB R0, #1)
Её сохранять обратно в память таким образом? - STR R0, [#test0] ? Компилятор выделит память под 4 байта?

DCWU это и есть "выделение" памяти.
Вы не сообщили, зачем именно ассемблер, но одним из лозунгов ARM при введении Cortex и ПО к нему (CMSIS, периферийных библиотек производителей) было типа "no assembler".
scifi
Цитата(KnightIgor @ Feb 3 2014, 12:39) *
Вы не сообщили, зачем именно ассемблер

Уже спрашивали там. Ответ получился сумбурный и ни разу не убедительный.
Сергей Борщ
Цитата(KnightIgor @ Feb 3 2014, 10:39) *
Вы не сообщили, зачем именно ассемблер
Сообщал недели две назад. Объясняли. Не помогает. Ну хочет человек пробежаться по граблям. Не будем мешать.
SII
Цитата(allsettingsdone @ Feb 3 2014, 11:11) *
Не могу понять как создавать и работать с переменными разного размера в ассемблере в Keil


Документацию надо читать -- там всё написано.
allsettingsdone
Цитата(Палыч @ Feb 3 2014, 09:27) *
DCB, DCW, DCWU, DCD, DCDU....

Похоже что так всё работает, спасибо.
KRS
Цитата(Сергей Борщ @ Feb 3 2014, 13:26) *
Сообщал недели две назад...

с такими скоростями... первый проект выйдет когда чипы на cortex-m3 перестанут выпускаться bb-offtopic.gif
romas2010
Цитата(allsettingsdone @ Feb 3 2014, 11:54) *
Вот допустим я делаю счетчик, пишу test0 DCWU 0xFFFF
Затем уменьшаю на 1 ( MOV32 R0, #test0
SUB R0, #1)
Её сохранять обратно в память таким образом? - STR R0, [#test0] ? Компилятор выделит память под 4 байта?


Компилятор выделит 2 байта...более того,если вы этой командой перезапишете значение переменной test0,то потом 3 дня будете рвать на себе волосы,пытаясь понять,почему вдруг соседние 2 байта тоже вдруг перезаписываются...

Давайте исходить из следующих аксиом
1) не надо из ассемблера делать фетиш и тотем...программа на ассемблере размером более 100 строк непонятна уже даже ее автору
2) без ассемблера никуда-потому что самый лучший оптимизатор-это твоя собственная голова.Ни одному компилятору не понять прелестей некоторых команд и режимов адресации.
Отсюда выявляется золотая середина- оформленные в оболочку С-функций короткие подпрограммы,выполняющиеся быстрее эквивалентного С-кода хотя бы в 3 раза.
Учим матчасть Keil->help->mVision help-> embeded assembler,instruction set,assembler user guide,compiler guide и пр.
Пишем короткие программы,циклы,условия,компилируем,входим в симулятор,и наблюдаем в окне Disassemble,что,собственно говоря,получилось,
разбираемся,как компилятор получает доступ к переменным,к полям структур,работу с указателями,как передать в функцию параметры и пр..
scifi
Цитата(romas2010 @ Feb 13 2014, 00:06) *
2) без ассемблера никуда-потому что самый лучший оптимизатор-это твоя собственная голова.Ни одному компилятору не понять прелестей некоторых команд и режимов адресации.

С оговорками. Голова может оптимизировать ограниченный объём кода. В "среднем по больнице" современные компиляторы выигрывают всегда. Ну и самое главное: оптимизация реально требуется крайне редко. Обычно это прихоть новичков.
ohmjke
Цитата(scifi @ Feb 13 2014, 00:12) *
С оговорками. Голова может оптимизировать ограниченный объём кода. В "среднем по больнице" современные компиляторы выигрывают всегда. Ну и самое главное: оптимизация реально требуется крайне редко. Обычно это прихоть новичков.

Имеется в виду оптимизация, которую делает компилер, или кодер, используя асм-вставки в си коде?
scifi
Цитата(ohmjke @ Feb 14 2014, 09:46) *
Имеется в виду оптимизация, которую делает компилер, или кодер, используя асм-вставки в си коде?

И то, и другое.
Хотя сейчас работаю над программой, которая при нулевом уровне оптимизации уже не лезет в флеш. Для внутрисхемной отладки компилирую с оптимизацией по размеру, а потом отлаживаемый файл перекомпилирую с нулевой оптимизацией, чтобы влезло :-)
toweroff
Ну как сказать... с нулевой оптимизацией в Keil 5 у меня один проект получился 15 КБ (LPC1751)
Нужно еще один сектор отдать под бут и один - под сохранение настроек.
В принципе, мне было нужно еще килобайта два пустых. Можно было бы эти настройки совместить с кодом, потом при изменении сохранять все вместе, но это риск все-таки запороть прошивку
Оптимизация O3 и Cross-Module дали мне 11 КБ кода. Отлаживаться, конечно, практически нереально, но как окончательный вариант для прошивки - очень прилично.
ViKo
Цитата(toweroff @ Feb 14 2014, 13:03) *
Оптимизация O3 и Cross-Module дали мне 11 КБ кода. Отлаживаться, конечно, практически нереально, но как окончательный вариант для прошивки - очень прилично.

Еще у Keil есть оптимизация -Ospace, как противовес -Otime.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.