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

 
 
> Не удается повторить сишный код в асме АРМ., контроллер 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
Ответов
aaarrr
сообщение Nov 23 2009, 10:02
Сообщение #2


Гуру
******

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



Bulat, вы с дизассемблированным кодом C-программы ознакомились? От этого надо начинать.
Более того, могу с уверенностью сказать, что руками оптимизировать там нечего.
Go to the top of the page
 
+Quote Post
Bulat
сообщение Nov 23 2009, 10:18
Сообщение #3


Местный
***

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



Цитата(aaarrr @ Nov 23 2009, 16:02) *
Bulat, вы с дизассемблированным кодом C-программы ознакомились? От этого надо начинать.
Более того, могу с уверенностью сказать, что руками оптимизировать там нечего.

В дизассемблированном коде программы на одну операцию сдвига datA = datA<<1 приходится 5 асм-команд, в то время, как у меня в асм-коде на это тратится одна команда mov r0, r0, lsl #1.
А можно в Си-коде, допустим, в качестве сдвиговой переменной datA назначить один из регистров r0,r1,... и напрямую к нему обращаться из сишного когда?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Nov 23 2009, 10:41
Сообщение #4


Гуру
******

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



Цитата(Bulat @ Nov 23 2009, 13:18) *
В дизассемблированном коде программы на одну операцию сдвига datA = datA<<1 приходится 5 асм-команд, в то время, как у меня в асм-коде на это тратится одна команда mov r0, r0, lsl #1.

Не верю. Листинг приложите.

Цитата(Bulat @ Nov 23 2009, 13:18) *
А можно в Си-коде, допустим, в качестве сдвиговой переменной datA назначить один из регистров r0,r1,... и напрямую к нему обращаться из сишного когда?

Да компилятор сам все замечательно сделает, если только вы ему мешать не будете. Где, например, в вашей C-программе локальные переменные?
Go to the top of the page
 
+Quote Post
Bulat
сообщение Nov 23 2009, 11:06
Сообщение #5


Местный
***

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



Цитата(aaarrr @ Nov 23 2009, 16:41) *
Не верю. Листинг приложите.


Да компилятор сам все замечательно сделает, если только вы ему мешать не будете. Где, например, в вашей C-программе локальные переменные?

Дизассемблерный код для функции:
Код
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;
  
}


Код
timer0_irq_handler:
  0000083C  E59F041C  LDR          R0, [PC, #+1052]        ; [0xC60] =ii (0x2001B0)
  00000840  E59F1418  LDR          R1, [PC, #+1048]        ; [0xC60] =ii (0x2001B0)
  00000844  E5911000  LDR          R1, [R1, #+0]
  00000848  E2511001  SUBS         R1, R1, #0x1
  0000084C  E5801000  STR          R1, [R0, #+0]
  if(ii==0) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
  00000850  E59F0408  LDR          R0, [PC, #+1032]        ; [0xC60] =ii (0x2001B0)
  00000854  E5900000  LDR          R0, [R0, #+0]
  00000858  E3500000  CMP          R0, #0x0
  0000085C  1A000003  BNE          0x000870
  if(ii==0) {MipsTimerBase->TC_CCR = AT91C_TC_CLKDIS;}
  00000860  E59F03FC  LDR          R0, [PC, #+1020]        ; [0xC64] =MipsTimerBase (0x17B4)
  00000864  E5900000  LDR          R0, [R0, #+0]
  00000868  E3A01002  MOV          R1, #0x2
  0000086C  E5801000  STR          R1, [R0, #+0]
  MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
  00000870  E59F03EC  LDR          R0, [PC, #+1004]        ; [0xC64] =MipsTimerBase (0x17B4)
  00000874  E5900000  LDR          R0, [R0, #+0]
  00000878  E3A0101E  MOV          R1, #0x1E
  0000087C  E5801014  STR          R1, [R0, #+20]
  MipsTimerBase->TC_RA = 30; MipsTimerBase->TC_RB = MipsTimerBase->TC_RC = 60;
  00000880  E3A0003C  MOV          R0, #0x3C
  00000884  E59F13D8  LDR          R1, [PC, #+984]         ; [0xC64] =MipsTimerBase (0x17B4)
  00000888  E5911000  LDR          R1, [R1, #+0]
  0000088C  E581001C  STR          R0, [R1, #+28]
  00000890  E59F13CC  LDR          R1, [PC, #+972]         ; [0xC64] =MipsTimerBase (0x17B4)
  00000894  E5911000  LDR          R1, [R1, #+0]
  00000898  E5810018  STR          R0, [R1, #+24]
        if(datA&0x80000000) regA = 0x20000;
  0000089C  E59F03B8  LDR          R0, [PC, #+952]         ; [0xC5C] =datA (0x2001A0)
  000008A0  E5900000  LDR          R0, [R0, #+0]
  000008A4  E3100480  TST          R0, #0x80000000
  000008A8  0A000003  BEQ          0x0008BC
        if(datA&0x80000000) regA = 0x20000;
  000008AC  E59F03A0  LDR          R0, [PC, #+928]         ; [0xC54] =regA (0x2001AC)
  000008B0  E3A01B80  MOV          R1, #0x20000            ; 0x208B8
  000008B4  E5801000  STR          R1, [R0, #+0]
  000008B8  EA000002  B            0x0008C8
        else regA = 0x0;
  000008BC  E59F0390  LDR          R0, [PC, #+912]         ; [0xC54] =regA (0x2001AC)
  000008C0  E3A01000  MOV          R1, #0x0                ; 0x8C8
  000008C4  E5801000  STR          R1, [R0, #+0]
    regs->PIOA_ODSR = regA|front;    
  000008C8  E59F0380  LDR          R0, [PC, #+896]         ; [0xC50] =regs (0x200000)
  000008CC  E5900000  LDR          R0, [R0, #+0]
  000008D0  E59F137C  LDR          R1, [PC, #+892]         ; [0xC54] =regA (0x2001AC)
  000008D4  E5911000  LDR          R1, [R1, #+0]
  000008D8  E59F2378  LDR          R2, [PC, #+888]         ; [0xC58] =front (0x200108)
  000008DC  E5922000  LDR          R2, [R2, #+0]
  000008E0  E1921001  ORRS         R1, R2, R1
  000008E4  E5801438  STR          R1, [R0, #+1080]
    datA = datA<<1;  
  000008E8  E59F036C  LDR          R0, [PC, #+876]         ; [0xC5C] =datA (0x2001A0)
  000008EC  E59F1368  LDR          R1, [PC, #+872]         ; [0xC5C] =datA (0x2001A0)
  000008F0  E5911000  LDR          R1, [R1, #+0]
  000008F4  E1B01081  MOVS         R1, R1, LSL #1
  000008F8  E5801000  STR          R1, [R0, #+0]
    dummy = MipsTimerBase->TC_SR;
  000008FC  E59F0120  LDR          R0, [PC, #+288]         ; [0xA24] =dummy (0x2001C8)
  00000900  E59F135C  LDR          R1, [PC, #+860]         ; [0xC64] =MipsTimerBase (0x17B4)
  00000904  E5911000  LDR          R1, [R1, #+0]
  00000908  E5911020  LDR          R1, [R1, #+32]
  0000090C  E5801000  STR          R1, [R0, #+0]
}
  00000910  E12FFF1E  BX           LR


обратите внимание на:
Код
datA = datA<<1;  
  000008E8  E59F036C  LDR          R0, [PC, #+876]         ; [0xC5C] =datA (0x2001A0)
  000008EC  E59F1368  LDR          R1, [PC, #+872]         ; [0xC5C] =datA (0x2001A0)
  000008F0  E5911000  LDR          R1, [R1, #+0]
  000008F4  E1B01081  MOVS         R1, R1, LSL #1
  000008F8  E5801000  STR          R1, [R0, #+0]


переменный datA,ii,front, используемы в обработчике прерывания, глобальные, так как они используются еще и в другой функции
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Nov 23 2009, 11:16
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Bulat @ Nov 23 2009, 17:06) *
переменный datA,ii,front, используемы в обработчике прерывания, глобальные, так как они используются еще и в другой функции

Ну и кто их будет в раме-то менять когда функция на асме?

В случае плохого владения асмом всё делается так: ставится максимальная (spd/size) оптимизация и полученный листинг тупо копируется на уровне асм-команд smile.gif После этого ничего уже от оптимизации не зависит. В некоторых случаях удаётся ещё оптимизировать листинг, но надо хорошо владеть асмом.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Bulat
сообщение Nov 23 2009, 11:51
Сообщение #7


Местный
***

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



я имел в виду лишние обращения к памяти, которых в моем коде нет:
000008E8 E59F036C LDR R0, [PC, #+876] ; [0xC5C] =datA (0x2001A0)
000008EC E59F1368 LDR R1, [PC, #+872] ; [0xC5C] =datA (0x2001A0)
000008F0 E5911000 LDR R1, [R1, #+0]

000008F4 E1B01081 MOVS R1, R1, LSL #1 - собственно само смещение.

000008F8 E5801000 STR R1, [R0, #+0]
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Bulat   Не удается повторить сишный код в асме АРМ.   Nov 23 2009, 06:15
- - Bulat   мне необходимо реализовать на асм-е следующий сишн...   Nov 23 2009, 06:34
|- - aaarrr   Цитата(Bulat @ Nov 23 2009, 09:34) это пр...   Nov 23 2009, 06:50
|- - 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 @ 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 Текстовая версия Сейчас: 19th July 2025 - 22:18
Рейтинг@Mail.ru


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