реклама на сайте
подробности

 
 
> программа на ассемблере
dimka76
сообщение Jun 4 2008, 11:23
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Добрового времени суток :-)

Хочу написать на ассемблере программку и что-бы она размещалась во внутренней SRAM.
Достаточно ли для этого в начале программы прописать .ORG <адресс SRAM> (естественно после всего того что нужно прописать в стартапе) ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vet
сообщение Jun 6 2008, 04:52
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



dimka76, mov не принимает вторым операндом произвольные константы, о чем компилятор и сообщает прямым текстом.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 6 2008, 09:24
Сообщение #3


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



поторопился радоваться.

Си файл
Код
extern __ramfunc void foo(void);

UINT data[255] = {1,1,2,3,4,.........,234};
UINT data[255] = {1,2,3,4,....,255};

void main(void)
{
  foo();
}


Фсеемблерный файл
Код
                NAME    ?foo        
    PUBLIC  foo        
                RSEG  CODE_I : CODE  


foo:
              mov   R1,#10
              mov   R2,#20
              mov   PC,LR

      ENDMOD  
      
      END


иду по шагам когда программа переходит к метке foo: смотрю дизассемблер
и там где должна быть ассемблерная строка расположены нули.

в файле линкера ключ -Q вставлен.

во FLASH образ функции foo() имеется (смотрю map файл и дизассемблер), но он не переписывается при старте во ОЗУ.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 6 2008, 09:54
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dimka76 @ Jun 6 2008, 12:24) *
Си файл
А текст самой foo - тайна? :-) используйте команду LDR R1, =Table1. Ассемблер сам положит константу с адресом Table1 где-то рядом с этой командой, а саму команду заменит на соответствующий LDR R1, [PC, #N]
Цитата(dimka76 @ Jun 6 2008, 12:24) *
во FLASH образ функции foo() имеется (смотрю map файл и дизассемблер), но он не переписывается при старте во ОЗУ.
А не подключаете ли вы к программе свой cstartup.s79? Если да, то смотрите - есть ли там копирование. Библиотечный стартап копирование выполняет. A!! Есть у них такая штука, как массив в сегменте INITTAB. Его формат следующий:
Код
/* Structure of an element in the segment initialization table
* in segment INITTAB. Used for both zero-initialization and copying. */
typedef struct
{
  long   Size;                  /* Number of bytes to initialize */
  char*  Dst;                   /* Destination. If Dst==Src, then init to 0 */
  char*  Src;                   /* Source address. Usually in ROM. */
} InitBlock_Type;
А дальше библиотечная функция __segment_init(), проходя по этому массиву, делает копирование:
Код
pragma location="ICODE"
__interwork void __segment_init(void)
{
  InitBlock_Type const * const initTableBegin = __sfb( "INITTAB" );
  InitBlock_Type const * const initTableEnd = __sfe( "INITTAB" );
  InitBlock_Type const * initTableP;

  /* Loop over all elements in the initialization table. */
  for (initTableP=initTableBegin; initTableP<initTableEnd; initTableP++)
  {
    /* If src=dest then we should clear a memory
     * block, otherwise it's a copy operation. */
    if (initTableP->Src == initTableP->Dst)
    {
      memset(initTableP->Dst, 0, initTableP->Size);
    }
    else
    {
      memcpy(initTableP->Dst, initTableP->Src, initTableP->Size);
    }
  }
}
Значит, в вашем ассемблерном файле, вам надо сделать
Код
    RSEG INITTAB:CODE
    dw  .....
    dw  .....
    dw  .....
Вот только сразу не соображу - как взять адрес, откуда копировать. Компилятор как-то подставляет, а как тут сделать - ума не приложу. Вот есть кое-что на сайте самого ИАРа. А вот это как раз подходит под ваш случай. Придется заводить свои сегменты sad.gif В gcc это сделано более оптимально, без массива.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016