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

 
 
> Не удается повторить сишный код в асме АРМ., контроллер at91sam7s
Bulat
сообщение Nov 23 2009, 06:15
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



мне необходимо реализовать на асм-е следующий сишный код:
Код
if(datA&0x80000000) regA = 0x20000;
else regA = 0x0;

Но операнд в ARM-команде может иметь макс длину 12 бит, поэтому в асм-е я поступаю следующим образом:
Код
;r1 = datA, regA = r6
  mov      r6, r1
  mov      r6, r6, lsr #28
  and       r6, r6, #0x8                                                    
  ldrne     r6, =0x20000                                                    ;if(datA&0x80000000) regA = 0x20000
  ldreq     r6, =0                                                              ;else regA = 0x0

это правильно?
Заранее благодарен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Bulat
сообщение Nov 23 2009, 06:34
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 206
Регистрация: 12-10-06
Из: ufa
Пользователь №: 21 241



мне необходимо реализовать на асм-е следующий сишный код - обработчик прерывания таймера:
Код
__ramfunc void timer0_irq_handler()
{  
  ii--;                                                                          
  if(ii==0) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
  MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
  
  if(datA&0x80000000) regA = 0x20000;
  else regA = 0x0;
  regs->PIOA_ODSR = regA|front;    
  datA = datA<<1;  
    
  dummy = MipsTimerBase->TC_SR;  
}

Этот код рабочий, благодаря ему я получаю необходимую последовательность импульсов на выходе.
Так я повторил этот код на асме АРМ:
При прирывании вызываетя следующая функция:
__ramfunc void ASM_timer0_irq()
{
timer0_irq_ASM(ii,datA,front);
}
которая в свою очередь вызывает асм-функциюи сообщает туда 3 параметра.

Код
IO_base         DEFINE  0xFFFFF400
ODSR            DEFINE  0x38
TC_base         DEFINE  0xFFFA0000
TC0_CCR       DEFINE  0x0
TC0_RA          DEFINE  0x14
TC0_RB          DEFINE  0x18
TC0_RC          DEFINE  0x1C
TC0_SR          DEFINE  0x20
TC_CLKDIS     DEFINE  0x2          

PUBLIC     timer0_irq_ASM
                                                            
timer0_irq_ASM                                                                 ;r0 = ii, r1 = dataA, r2 = front

  ldr     r12,=TC_base                                                         ;смещение для TC
  ldr     r11,=IO_base                                                         ;смещение для PIO
  sub     r0, r0, #1                                                              ;ii--
  beq     Stop_TC0
  bne     Work_TC0

Stop_TC0:
  ldr      r7, =TC_CLKDIS
  str      r7,[r12,#TC0_CCR]                                                   ;MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS
  b        timer0_irq_ASM_end  
  
  Work_TC0:
  ldr      r7, =30
  str      r7,[r12, #TC0_RA]                                                    ;MipsTimerBase->TC_RA = 30
  ldr      r7, =60
  str      r7, [r12, #TC0_RB]                                                    ;MipsTimerBase->TC_RB = 60
  str      r7, [r12, #TC0_RC]                                                    ;MipsTimerBase->TC_RC = 60
  
  
  mov      r6, r1, lsr #28                                                       ;смещаем содержимое r1 (datA) вправо на 28 бит, так как операнд не может быть больше 12 бит в длину, а мне необходимо анализировать состояние 32-бита r1
  and      r6, r6, #0x8                                                    
  ldrne    r6, =0x20000                                                        ;if(datA&0x80000000) regA = 0x20000
  ldreq    r6, =0                                                                  ;else regA = 0x0
  orr      r6, r6, r2
  str      r6, [r11, #ODSR]                                                      ;regs->PIOA_ODSR = regA|front
  mov      r0, r0, lsl #1                                                          ;datA = datA<<1
  ldr      r6, [r12, #TC0_SR]                                                    ;dummy = MipsTimerBase->TC_SR
    

  timer0_irq_ASM_end:
  bx       lr

асм-код не работает так же, как и сишный. то есть таймер запускается, импульсы нужной частоты идут, но таймер не останавливается при обнулении счетчика ii и не меняет ldrne r6, =0x20000 или ldreq r6, =0 в зависимости от содержимого r1.

Заранее благодарен.

Сообщение отредактировал Bulat - Nov 23 2009, 07:05
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 23 2009, 06:50
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Bulat @ Nov 23 2009, 09:34) *
это правильно?

Нет, правильно будет так:
Код
;r1 = datA, regA = r6
ANDS     r6,r1,#0x80000000
MOVNE    r6,#0x20000

Числа вида "константа со сдвигом" можно загружать командой MOV. Ну а вообще в таких конструкциях бесполезно пытаться переплюнуть C-компилятор.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Bulat   Не удается повторить сишный код в асме АРМ.   Nov 23 2009, 06:15
|- - aaarrr   Цитата(Bulat @ Nov 23 2009, 09:34) асм-ко...   Nov 23 2009, 07:30
|- - Bulat   Цитата(aaarrr @ Nov 23 2009, 13:30) Да, н...   Nov 23 2009, 09:13
|- - GetSmart   Цитата(Bulat @ Nov 23 2009, 15:13) Почему...   Nov 23 2009, 09:27
|- - Bulat   Цитата(GetSmart @ Nov 23 2009, 15:27) sub...   Nov 23 2009, 09:44
|- - GetSmart   Нельзя же так быстро цитировать Bulat, в асм-фун...   Nov 23 2009, 10:23
|- - Bulat   Цитата(GetSmart @ Nov 23 2009, 16:23) А в...   Nov 23 2009, 10:30
- - sergeeff   Кодtst r1, #2, 2; -2147483648 (0x80000000...   Nov 23 2009, 07:02
- - sergeeff   Авторы многих книг предупреждают о вреде преждевре...   Nov 23 2009, 08:06
|- - GetSmart   Цитата(sergeeff @ Nov 23 2009, 14:06) Авт...   Nov 23 2009, 08:52
|- - andrew_b   Цитата(GetSmart @ Nov 23 2009, 12:52) Мо...   Nov 23 2009, 08:58
|- - sergeeff   Цитата(GetSmart @ Nov 23 2009, 11:52) Мо...   Nov 23 2009, 09:08
- - sergeeff   Быстрее и короче: Код ldr r12,=TC_base ...   Nov 23 2009, 09:35
- - aaarrr   Bulat, вы с дизассемблированным кодом C-программы ...   Nov 23 2009, 10:02
|- - Bulat   Цитата(aaarrr @ Nov 23 2009, 16:02) Bulat...   Nov 23 2009, 10:18
|- - aaarrr   Цитата(Bulat @ Nov 23 2009, 13:18) В диза...   Nov 23 2009, 10:41
|- - Bulat   Цитата(aaarrr @ Nov 23 2009, 16:41) Не ве...   Nov 23 2009, 11:06
|- - GetSmart   Цитата(Bulat @ Nov 23 2009, 17:06) переме...   Nov 23 2009, 11:16
|- - Bulat   я имел в виду лишние обращения к памяти, которых в...   Nov 23 2009, 11:51
|- - aaarrr   Цитата(Bulat @ Nov 23 2009, 14:06) переме...   Nov 23 2009, 12:46
- - sergeeff   У вас в С-ой программе сплошь глобальные переменны...   Nov 23 2009, 12:10
- - defunct   Цитата(sergeeff @ Nov 23 2009, 14:10) Сов...   Nov 23 2009, 12:19
- - Bulat   Цитата(sergeeff @ Nov 23 2009, 18:10) У в...   Nov 23 2009, 12:49


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

 


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


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