|
Не удается повторить сишный код в асме АРМ., контроллер at91sam7s |
|
|
|
Nov 23 2009, 06:15
|
Местный
  
Группа: Участник
Сообщений: 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 это правильно? Заранее благодарен.
|
|
|
|
|
 |
Ответов
|
Nov 23 2009, 10:18
|
Местный
  
Группа: Участник
Сообщений: 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,... и напрямую к нему обращаться из сишного когда?
|
|
|
|
|
Nov 23 2009, 10:41
|
Гуру
     
Группа: Свой
Сообщений: 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-программе локальные переменные?
|
|
|
|
|
Nov 23 2009, 11:06
|
Местный
  
Группа: Участник
Сообщений: 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, используемы в обработчике прерывания, глобальные, так как они используются еще и в другой функции
|
|
|
|
|
Nov 23 2009, 11:16
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Bulat @ Nov 23 2009, 17:06)  переменный datA,ii,front, используемы в обработчике прерывания, глобальные, так как они используются еще и в другой функции Ну и кто их будет в раме-то менять когда функция на асме? В случае плохого владения асмом всё делается так: ставится максимальная (spd/size) оптимизация и полученный листинг тупо копируется на уровне асм-команд  После этого ничего уже от оптимизации не зависит. В некоторых случаях удаётся ещё оптимизировать листинг, но надо хорошо владеть асмом.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Nov 23 2009, 11:51
|
Местный
  
Группа: Участник
Сообщений: 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]
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|