|
Создание и работа с переменными в ассемблере |
|
|
|
Feb 3 2014, 07:11
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284

|
Не могу понять как создавать и работать с переменными разного размера в ассемблере в Keil. Директивы DB, DW, DD выдают ошибку(похоже на то, что Keil их вообще не знает), BYTE, WORD, DWORD - то же самое. Как я понял директивы GBLL, GBLS, GBLA создают (в RAM?) переменную и далее ей можно придать значение используя SETA, SETL, SETS, но при попытке повторно сохранить значение этой переменной получаем ошибку при компиляции, да и не понятно где именно в памяти Keil разместит переменную. Можно конечно сделать так Var0 EQU 0x(адрес переменной в памяти), но есть ли другие(более удобные) способы ? И как вообще принято это делать?
|
|
|
|
|
Feb 3 2014, 07:27
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(allsettingsdone @ Feb 3 2014, 11:11)  Директивы DB, DW, DD выдают ошибку(похоже на то, что Keil их вообще не знает), BYTE, WORD, DWORD - то же самое. DCB, DCW, DCWU, DCD, DCDU....
|
|
|
|
|
Feb 3 2014, 07:54
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284

|
Цитата(Палыч @ Feb 3 2014, 09:27)  DCB, DCW, DCWU, DCD, DCDU.... Вот допустим я делаю счетчик, пишу test0 DCWU 0xFFFF Затем уменьшаю на 1 ( MOV32 R0, #test0 SUB R0, #1) Её сохранять обратно в память таким образом? - STR R0, [#test0] ? Компилятор выделит память под 4 байта?
|
|
|
|
|
Feb 3 2014, 08:39
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(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".
|
|
|
|
|
Feb 3 2014, 10:46
|
Участник

Группа: Участник
Сообщений: 32
Регистрация: 22-01-13
Пользователь №: 75 284

|
Цитата(Палыч @ Feb 3 2014, 09:27)  DCB, DCW, DCWU, DCD, DCDU.... Похоже что так всё работает, спасибо.
|
|
|
|
|
Feb 12 2014, 20:06
|
Участник

Группа: Участник
Сообщений: 63
Регистрация: 25-11-11
Пользователь №: 68 515

|
Цитата(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,что,собственно говоря,получилось, разбираемся,как компилятор получает доступ к переменным,к полям структур,работу с указателями,как передать в функцию параметры и пр..
|
|
|
|
|
Feb 14 2014, 05:46
|

Частый гость
 
Группа: Участник
Сообщений: 116
Регистрация: 27-01-10
Из: СПб
Пользователь №: 55 094

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