|
|
 |
Ответов
|
Jun 30 2010, 09:22
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
"Шеф, все пропало!..." По команде *(uint32_t *)(string + 8) = (uint32_t)" 0"; заносится адрес строки, а не сама строка! На всякий случай, если кто-то заинтересуется, выдаю работающий код. Код void itoad(int number, uint8_t *string) { #define TETRASPACE ' ' | ' ' << 8 | ' ' << 16 | ' ' << 24 #define TETRATAIL ' ' | ' ' << 8 | '0' << 16 | '\0'<< 24 uint8_t sign; *(uint32_t *)(string) = TETRASPACE; *(uint32_t *)(string + 4) = TETRASPACE; *(uint32_t *)(string + 8) = TETRATAIL; string += 10; if (!number) return; if (number > 0) sign = '+'; else { number = -number; sign = '-'; } do { *string-- = number % 10 + '0'; } while (number /= 10); *string = sign; } Часть листинга, обратите внимание, стоит команда LDR, а не ADR, как раньше Код ;;;31 *(uint32_t *)(string) = TETRASPACE; 000002 f04f3220 MOV r2,#0x20202020 ;;;32 *(uint32_t *)(string + 4) = TETRASPACE; 000006 600a STR r2,[r1,#0] ;;;33 *(uint32_t *)(string + 8) = TETRATAIL; 000008 604a STR r2,[r1,#4] 00000a 4a3a LDR r2,|L1.244| ;;;34 string += 10; 00000c 608a STR r2,[r1,#8] 00000e 310a ADDS r1,r1,#0xa
|
|
|
|
|
Jun 30 2010, 19:02
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (ViKo @ Jun 30 2010, 11:22)  На всякий случай.. Ну если упорно не хотите нормальное сравнение следать, то вот: CODE 59 void itoad(int number, uint8_t *string) 60 { \ itoad: \ 00000000 10B4 PUSH {R4} 61 int sign; 62 *(int32_t *) string = 0x20202020; \ 00000002 .... LDR.N R2,??DataTable1_1;; 0x20202020 \ 00000004 0A60 STR R2,[R1, #+0] 63 *(int32_t *)(string += 4) = 0x20202020; \ 00000006 4A60 STR R2,[R1, #+4] 64 *(int32_t *)(string += 4) = 0x00302020; \ 00000008 .... LDR.N R2,??DataTable1_2;; 0x302020 \ 0000000A 8A60 STR R2,[R1, #+8] 65 string += 2; \ 0000000C 0A31 ADDS R1,R1,#+10 66 if (!number) return; \ 0000000E 78B1 CBZ.N R0,??itoad_0 67 if (number > 0) sign = '+'; \ 00000010 0128 CMP R0,#+1 \ 00000012 AEBF ITEE GE \ 00000014 2B22 MOVGE R2,#+43 \ 00000016 4042 RSBLT R0,R0,#+0 \ 00000018 2D22 MOVLT R2,#+45 68 else { 69 number = -number; 70 sign = '-'; 71 } 72 do { 73 *string-- = number % 10 + '0'; \ ??itoad_1: \ 0000001A 0A23 MOVS R3,#+10 \ 0000001C 90FBF3F4 SDIV R4,R0,R3 \ 00000020 03FB1400 MLS R0,R3,R4,R0 \ 00000024 3030 ADDS R0,R0,#+48 \ 00000026 01F80109 STRB R0,[R1], #-1 74 } while (number /= 10); \ 0000002A 2000 MOVS R0,R4 \ 0000002C F5D1 BNE.N ??itoad_1 75 *string = sign; \ 0000002E 0A70 STRB R2,[R1, #+0] 76 } \ ??itoad_0: \ 00000030 10BC POP {R4} \ 00000032 7047 BX LR ;; return
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 30 2010, 20:29
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(zltigo @ Jun 30 2010, 22:02)  Ну если упорно не хотите нормальное сравнение сделать, то вот: Вы имеете в виду сравнение кода, или операции сравнения внутри кода? Почему не хочу? Еще как! Листинг я же выдал, там, в файлике keil_temp.txt (он и создается Keil-ом именно в таком виде, с расширением txt). Вот еще раз, после замены типа переменной sign (думал, может в ней дело). С недоумением разглядываю ваш и свой листинги, ничего путного на ум не приходит. Код itoad PROC ;;;27 *************************************************************************** ****/ ;;;28 void itoad(int number, uint8_t *string) 000000 b510 PUSH {r4,lr} ;;;29 { ;;;30 #define TETRASPACE ' ' | ' ' << 8 | ' ' << 16 | ' ' << 24 ;;;31 #define TETRATAIL ' ' | ' ' << 8 | '0' << 16 | '\0'<< 24 ;;;32 // uint8_t sign; ;;;33 int sign; ;;;34 *(uint32_t *)(string) = TETRASPACE; 000002 f04f3220 MOV r2,#0x20202020 ;;;35 *(uint32_t *)(string + 4) = TETRASPACE; 000006 600a STR r2,[r1,#0] ;;;36 *(uint32_t *)(string + 8) = TETRATAIL; 000008 604a STR r2,[r1,#4] 00000a 4a62 LDR r2,|L1.404| ;;;37 string += 10; 00000c 608a STR r2,[r1,#8] 00000e 310a ADDS r1,r1,#0xa ;;;38 if (!number) return; 000010 2800 CMP r0,#0 000012 d011 BEQ |L1.56| ;;;39 if (number > 0) sign = '+'; 000014 dd02 BLE |L1.28| 000016 f04f042b MOV r4,#0x2b 00001a e001 B |L1.32| |L1.28| ;;;40 else { ;;;41 number = -number; 00001c 4240 RSBS r0,r0,#0 ;;;42 sign = '-'; 00001e 242d MOVS r4,#0x2d |L1.32| ;;;43 } ;;;44 do { ;;;45 *string-- = number % 10 + '0'; 000020 230a MOVS r3,#0xa |L1.34| 000022 4602 MOV r2,r0 000024 fb90f0f3 SDIV r0,r0,r3 000028 fb032210 MLS r2,r3,r0,r2 00002c 3230 ADDS r2,r2,#0x30 00002e f8012901 STRB r2,[r1],#-1 ;;;46 } while (number /= 10); 000032 2800 CMP r0,#0 000034 d1f5 BNE |L1.34| ;;;47 *string = sign; 000036 700c STRB r4,[r1,#0] |L1.56| ;;;48 } 000038 bd10 POP {r4,pc} ;;;49 ENDP У вас метка itoad играет какую-то роль? Почему-то у меня запоминается в стеке LR, а у вас нет. У вас в строке 63 должно быть число 0x20202020 или, как написано? Сравнение number производится по-разному, но я не вижу в исходниках разницы. И это LDR.N - там действительно будет по 2 байта? Где-то рядом таблица? Забавно, что байты в машинных кодах в IAR и Keil написаны по-разному. Где младший, где старший? Еще один прикол - у меня '+' заносится в регистр 4-байтовой командой (потому что не имеет повторяющейся последовательности?), а '-' 2-байтовой. У вас все 2-байтовые. Неужели IAR настолько лучше Keil?
|
|
|
|
Сообщений в этой теме
badik Вопрос С Jun 24 2010, 18:29 DRUID3 atoi()/itoa(); Или что-то отсюда... Jun 24 2010, 18:43 Genadi Zawidowski Тут или пользоваться sprintf (или её вариантами - ... Jun 24 2010, 18:57 ViKo В свое время я задавал такой же вопрос. Получил не... Jun 25 2010, 11:29 zltigo QUOTE (ViKo @ Jun 25 2010, 14:29) Сам нап... Jun 25 2010, 11:38  sonycman Цитата(zltigo @ Jun 25 2010, 15:38) Совет... Jun 25 2010, 12:15  ViKo Цитата(zltigo @ Jun 25 2010, 14:38) Совет... Jun 25 2010, 12:21 jorikdima Цитата(ViKo @ Jun 25 2010, 15:29) В свое ... Jun 25 2010, 12:17 defunct Цитата(ViKo @ Jun 25 2010, 14:29) Сам нап... Jun 25 2010, 16:48  ssvSerge Цитата(defunct @ Jun 25 2010, 19:48) Друг... Jun 25 2010, 17:26 zltigo QUOTE (sonycman @ Jun 25 2010, 15:15) Что... Jun 25 2010, 12:24 ViKo Цитата(zltigo @ Jun 25 2010, 15:24) ...ли... Jun 25 2010, 12:31  sonycman Цитата(ViKo @ Jun 25 2010, 16:31) Оставил... Jun 25 2010, 12:38   zltigo QUOTE (sonycman @ Jun 25 2010, 15:38) Осо... Jun 25 2010, 12:57    ViKo Цитата(zltigo @ Jun 25 2010, 15:57) В дан... Jun 25 2010, 13:06    sonycman Цитата(zltigo @ Jun 25 2010, 16:57) Ну дл... Jun 25 2010, 13:13     aaarrr Цитата(sonycman @ Jun 25 2010, 17:13) Нер... Jun 25 2010, 13:14 ViKo Цитата(zltigo @ Jun 25 2010, 15:24) лучше... Jun 25 2010, 12:50  zltigo QUOTE (ViKo @ Jun 25 2010, 15:50) У вас е... Jun 25 2010, 13:28   ViKo Цитата(zltigo @ Jun 25 2010, 16:28) как и... Jun 25 2010, 13:34    zltigo QUOTE (ViKo @ Jun 25 2010, 16:34) нужно п... Jun 25 2010, 13:39     ViKo Цитата(zltigo @ Jun 25 2010, 16:39) Про ... Jun 25 2010, 13:43      aaarrr Цитата(ViKo @ Jun 25 2010, 17:43) И к код... Jun 25 2010, 14:49 aaarrr Просто как пример:
Кодunsigned int short2str(c... Jun 25 2010, 12:41 zltigo QUOTE (ViKo @ Jun 25 2010, 16:43) Это у в... Jun 25 2010, 13:56 ViKo Цитата(zltigo @ Jun 25 2010, 16:56) Ну эт... Jun 25 2010, 14:04  zltigo QUOTE (ViKo @ Jun 25 2010, 17:04) О! ... Jun 25 2010, 14:10   ViKo Цитата(zltigo @ Jun 25 2010, 17:10) Ну, н... Jun 25 2010, 16:15    Genadi Zawidowski Цитата(ViKo @ Jun 25 2010, 20:15) А разве... Jun 25 2010, 20:33     ViKo Цитата(Genadi Zawidowski @ Jun 25 2010, 23... Jun 25 2010, 21:29     ReAl Цитата(Genadi Zawidowski @ Jun 25 2010, 23... Jun 26 2010, 09:04      sonycman Цитата(ReAl @ Jun 26 2010, 13:04) Оптимиз... Jun 26 2010, 09:23      demiurg_spb Цитата(ReAl @ Jun 26 2010, 13:04) Так что... Jun 27 2010, 18:51 sonycman Цитата(zltigo @ Jun 25 2010, 17:56) А то,... Jun 25 2010, 14:55  zltigo QUOTE (sonycman @ Jun 25 2010, 17:55) Буд... Jun 25 2010, 16:30 Goodefine Когда то для дисплея (отсюда фиксированное число ц... Jun 25 2010, 16:19 ViKo Цитата(Goodefine @ Jun 25 2010, 19:19) vo... Jun 25 2010, 17:16 ViKo Пролистал K&R второе издание от корки до корки... Jun 25 2010, 19:15 aaarrr Цитата(ViKo @ Jun 25 2010, 23:15) Найти б... Jun 25 2010, 19:20 dimka76 Цитата(ViKo @ Jun 25 2010, 23:15) Пролист... Jun 26 2010, 04:36 zltigo QUOTE (ViKo @ Jun 25 2010, 22:15) Пролист... Jun 26 2010, 08:11  ViKo Цитата(zltigo @ Jun 26 2010, 11:11) Не об... Jun 26 2010, 09:08   zltigo QUOTE (ViKo @ Jun 26 2010, 12:08) А я для... Jun 26 2010, 09:18 sigmaN K&R не Ымбеддеры. А zltigo дело говорит вам. К... Jun 25 2010, 19:27 ViKo Покопался в своих проектах, нашел преобразование д... Jun 25 2010, 19:52 Непомнящий Евгений В свое время написал такое:
CODE
/**
* "Указ... Jun 26 2010, 09:16 ViKo Следуя рекомендациям, слегка модернизировал код.
К... Jun 26 2010, 10:24 ssvSerge Цитата(ViKo @ Jun 26 2010, 14:24) Следуя ... Jun 26 2010, 11:31 zltigo QUOTE (ViKo @ Jun 26 2010, 13:24) Для все... Jun 26 2010, 15:05  ViKo Цитата(zltigo @ Jun 26 2010, 18:05) // За... Jun 26 2010, 16:28   zltigo QUOTE (ViKo @ Jun 26 2010, 19:28) Sign - ... Jun 26 2010, 16:40   aaarrr Цитата(ViKo @ Jun 26 2010, 20:28) 2 aaarr... Jun 26 2010, 16:51 ViKo 2 ssvSerge
В ваших алгоритмах число записывается з... Jun 26 2010, 13:55 ssvSerge Цитата(ViKo @ Jun 26 2010, 16:55) В алгор... Jun 26 2010, 14:19  ViKo Цитата(ssvSerge @ Jun 26 2010, 17:19) ну ... Jun 26 2010, 14:42   ssvSerge Цитата(ViKo @ Jun 26 2010, 18:42) для мен... Jun 26 2010, 15:12   aaarrr Цитата(ViKo @ Jun 26 2010, 18:42) В данны... Jun 26 2010, 15:14 ViKo Спасибо всем! На сегодня и завтра - умолкаю. ... Jun 26 2010, 17:00 sonycman Цитата(ViKo @ Jun 26 2010, 21:00) Возраду... Jun 27 2010, 17:02 badik Господа всем огромный привет, ни как не думал, что... Jun 28 2010, 17:43 ViKo Прежде, чем писать новое, изучил в отладчике работ... Jun 28 2010, 21:09 zltigo QUOTE (ViKo @ Jun 29 2010, 00:09) Заносит... Jun 28 2010, 21:33  ViKo Цитата(zltigo @ Jun 29 2010, 00:33) Их у ... Jun 28 2010, 21:57   zltigo QUOTE (ViKo @ Jun 29 2010, 00:57) Перед ... Jun 28 2010, 22:03    ViKo 2 zltigo
Непременно.
Выставил две "галки... Jun 29 2010, 08:29 ViKo Кодvoid itoad(int number, uint8_t *string... Jun 29 2010, 13:48 Сергей Борщ Цитата(ViKo @ Jun 29 2010, 16:48) Код *... Jun 29 2010, 14:18  ViKo Цитата(Сергей Борщ @ Jun 29 2010, 17:18) ... Jun 29 2010, 14:29  zltigo QUOTE (Сергей Борщ @ Jun 29 2010, 17:18) ... Jun 29 2010, 14:34   ViKo Цитата(zltigo @ Jun 29 2010, 17:34) *(uin... Jun 29 2010, 14:39    zltigo QUOTE (ViKo @ Jun 29 2010, 17:39) Кавычки... Jun 29 2010, 14:45   ViKo Цитата(zltigo @ Jun 29 2010, 17:34) Код ... Jun 29 2010, 17:23    zltigo QUOTE (ViKo @ Jun 29 2010, 20:23) Так - н... Jun 29 2010, 17:40     ViKo Цитата(zltigo @ Jun 29 2010, 20:40) Код ... Jun 29 2010, 18:29      zltigo QUOTE (ViKo @ Jun 29 2010, 21:29) В смысл... Jun 29 2010, 18:38       ViKo Цитата(zltigo @ Jun 29 2010, 21:38) Вот к... Jun 29 2010, 19:52        zltigo QUOTE (ViKo @ Jun 29 2010, 22:52) Во всех... Jun 29 2010, 21:13  ViKo Цитата(Сергей Борщ @ Jun 29 2010, 17:18) ... Jul 1 2010, 08:55   zltigo QUOTE (ViKo @ Jul 1 2010, 10:55) Только в... Jul 1 2010, 11:57    ViKo Цитата(zltigo @ Jul 1 2010, 14:57) Это де... Jul 1 2010, 12:34     zltigo QUOTE (ViKo @ Jul 1 2010, 14:34) Давайте ... Jul 1 2010, 12:38      ViKo Цитата(zltigo @ Jul 1 2010, 15:38) Думае... Jul 1 2010, 12:52       zltigo QUOTE (ViKo @ Jul 1 2010, 14:52) Хочу зна... Jul 1 2010, 12:55        ViKo Цитата(zltigo @ Jul 1 2010, 15:55) Посчит... Jul 1 2010, 13:59         zltigo QUOTE (ViKo @ Jul 1 2010, 15:59) 2 zltigo... Jul 1 2010, 14:11         sonycman Цитата(ViKo @ Jul 1 2010, 17:59) А SDIV r... Jul 1 2010, 15:24 ViKo Выкладываю ваш вариант.
Последнее, что вы написали... Jun 30 2010, 08:00   zltigo QUOTE (ViKo @ Jun 30 2010, 22:29) У вас в... Jun 30 2010, 21:14 ViKo 16-битовая версия (на основе 32-битовой)
Кодvoid ... Jun 30 2010, 11:26 MrYuran Вот никак не могу понять, почему никто до сих пор ... Jun 30 2010, 11:31 ViKo Цитата(MrYuran @ Jun 30 2010, 14:31) Вот ... Jun 30 2010, 11:35 ViKo Напоследок - проверил вариант с преобразованием в ... Jun 30 2010, 13:12 aaarrr Цитата(ViKo @ Jun 30 2010, 17:12) Получил... Jun 30 2010, 13:34  ViKo Цитата(aaarrr @ Jun 30 2010, 15:34) Ну, э... Jun 30 2010, 13:44 _Pasha Цитата(MrYuran @ Jun 30 2010, 14:31) Тяжё... Jun 30 2010, 21:42 ViKo Перепробовал все "извращения" со сравнен... Jul 2 2010, 09:07 ViKo Думаю, хуже не станет, если я доложу, что уменьшил... Jul 2 2010, 18:43
2 страниц
1 2 >
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|